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

  • Māris Zaharovs

    Māris Zahar

    28 Mayıs 2008
  • njhaley

    njhaley

    24 NİSAN 2006
  • Peyton

    Peyton

    28 Aralık 2008