SORU
20 Kasım 2010, CUMARTESİ


C# bir Sözlükte Mağaza fonksiyonları

Nasıl fonksiyonları saklamak bir Sözlük oluşturulur?

Teşekkürler.

Kullanıcı tarafından gerçekleştirilen 30 fonksiyonları var. Fonksiyonu çalıştırmak için bu şekilde olmak istiyorum

   private void functionName(arg1, arg2, arg3)
   {
       // code
   }

   dictionaryName.add("doSomething", functionName);

    private void interceptCommand(string command)
    {
        foreach ( var cmd in dictionaryName )
        {
            if ( cmd.Key.Equals(command) )
            {
                cmd.Value.Invoke();
            }
        }
    }

Ancak, işlev imzası hep aynı, böylece argümanlar farklı miktarda sahip değildir.

CEVAP
20 Kasım 2010, CUMARTESİ


Bu gibi:

Dictionary<int, Func<string, bool>>

Bu bir dize parametresi olmayan fonksiyonların mağaza ve boolean dönmek için izin verir.

dico[5] = foo => foo == "Bar";

Ya eğer işlevi anonim ise:

dico[5] = Foo;

Foo böyle tanımlanır:

public bool Foo(string bar)
{
    ...
}

GÜNCELLEME:

Senin güncelleme gördükten sonra Önceden çağırmak istediğiniz işlevin imzası bilmiyorsun gibi görünüyor. .Tüm bağımsız değişkenler geçirmek gerekir bir işlevi çağırmak için ve eğer argümanlar bunu başarmak için tek yol olacak ne varsa yok NET yansıması ile.

Ve burada başka bir alternatif var:

class Program
{
    static void Main()
    {
        // store
        var dico = new Dictionary<int, Delegate>();
        dico[1] = new Func<int, int, int>(Func1);
        dico[2] = new Func<int, int, int, int>(Func2);

        // and later invoke
        var res = dico[1].DynamicInvoke(1, 2);
        Console.WriteLine(res);
        var res2 = dico[2].DynamicInvoke(1, 2, 3);
        Console.WriteLine(res2);
    }

    public static int Func1(int arg1, int arg2)
    {
        return arg1   arg2;
    }

    public static int Func2(int arg1, int arg2, int arg3)
    {
        return arg1   arg2   arg3;
    }
}

Bu yaklaşım ile hala sözlük ilgili dizindeki her bir işlev için geçirilmesi gereken parametre sayısı ve türünü bilmeniz gerekir veya çalışma zamanı hatası alırsınız. Ve eğer senin işlevler dönüş değerleri yok eğer doğru değilse System.Func<> yerine System.Action<> kullanın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • laptopmag

    laptopmag

    25 Ocak 2008
  • ShayLoss

    ShayLoss

    5 Kasım 2009
  • UniqueApps

    UniqueApps

    4 Ocak 2009