2011-11-16 19 views
20

कॉल करना मैं एक सूची में विभिन्न स्थैतिक तरीकों को स्टोर करने में सक्षम होना चाहता हूं और बाद में उन्हें देखता हूं और गतिशील रूप से उन्हें कॉल करता हूं।गतिशील कार्यों की एक सूची और गतिशील रूप से उन्हें

स्थिर से प्रत्येक तरीका आर्ग, प्रकार के अलग अलग संख्या है और वापसी को महत्व देता

static int X(int,int).... 
static string Y(int,int,string) 

मैं एक सूची है कि मैं उन सब को जोड़ सकते हैं करना चाहते हैं:

List<dynamic> list 

list.Add(X); 
list.Add(Y); 

और बाद में:

dynamic result = list[0](1,2); 
dynamic result2 = list[1](5,10,"hello") 

सी # 4 में यह कैसे करें?

+2

+1, एक अलग प्रकार का प्रश्न। –

+0

+1, मुझे वह पसंद है – Dennis

+1

जो आप खोज रहे हैं वह है [कमांड पैटर्न] (http://en.wikipedia.org/wiki/Command_pattern)। Google कि 'C#' के साथ और आपको सेट किया जाना चाहिए। एक बेहतर उत्तर के लिए –

उत्तर

20

आप प्रत्येक विधि के लिए उचित प्रतिनिधि-प्रकार का उपयोग करके प्रतिनिधि-उदाहरणों की एक सूची बना सकते हैं।

var list = new List<dynamic> 
      { 
       new Func<int, int, int> (X), 
       new Func<int, int, string, string> (Y) 
      }; 

dynamic result = list[0](1, 2); // like X(1, 2) 
dynamic result2 = list[1](5, 10, "hello") // like Y(5, 10, "hello") 
+2

+1। –

+0

धन्यवाद, यह तकनीक पूरी तरह से काम किया! –

3

आप वास्तव में यहाँ dynamic की शक्ति की जरूरत नहीं है, आप सरल List<object> के साथ क्या कर सकते हैं:

class Program 
{ 
    static int f(int x) { return x + 1; } 
    static void g(int x, int y) { Console.WriteLine("hallo"); } 
    static void Main(string[] args) 
    { 
     List<object> l = new List<object>(); 
     l.Add((Func<int, int>)f); 
     l.Add((Action<int, int>)g); 
     int r = ((Func<int, int>)l[0])(5); 
     ((Action<int, int>)l[1])(0, 0); 
    } 
} 

(अच्छी तरह से, आप एक डाली की जरूरत है, लेकिन आप किसी भी तरह के हस्ताक्षर जानने की जरूरत वैसे भी संग्रहीत विधियों में से प्रत्येक)

2
List<dynamic> list = new List<dynamic>(); 
     Action<int, int> myFunc = (int x, int y) => Console.WriteLine("{0}, {1}", x, y); 
     Action<int, int> myFunc2 = (int x, int y) => Console.WriteLine("{0}, {1}", x, y); 
     list.Add(myFunc); 
     list.Add(myFunc2); 

     (list[0])(5, 6); 
संबंधित मुद्दे