2008-09-25 12 views
6

मैं निष्पादित करने के तरीकों की एक सूची बनाना चाहता हूं। प्रत्येक विधि में एक ही हस्ताक्षर होता है। मैं एक सामान्य संग्रह में प्रतिनिधियों लगाने के बारे में सोचा था, लेकिन मैं यह त्रुटि मिलती रहती:क्या मैं विधि पॉइंटर्स के संग्रह के रूप में एक सूची <T> का उपयोग कर सकता हूं? (सी #)

List<object> methodsToExecute; 

int Add(int x, int y) 
{ return x+y; } 

int Subtract(int x, int y) 
{ return x-y; } 

delegate int BinaryOp(int x, int y); 

methodsToExecute.add(new BinaryOp(add)); 
methodsToExecute.add(new BinaryOp(subtract)); 

foreach(object method in methodsToExecute) 
{ 
    method(1,2); 
} 

कैसे पूरा करने के लिए पर कोई भी विचार:

'method' is a 'variable' but is used like a 'method'

सिद्धांत रूप में, यहाँ मैं क्या करना चाहते हैं क्या है इस? धन्यवाद!

उत्तर

15

बेहतर होगा कि तुम, सूची के लिए एक अधिक विशिष्ट प्रकार के पैरामीटर का उपयोग एक BinaryOp के लिए सूची में object कास्ट करने के लिए की जरूरत है, या,: (? या 3,5)

delegate int BinaryOp(int x, int y); 

List<BinaryOp> methodsToExecute = new List<BinaryOp>(); 

methodsToExecute.add(Add); 
methodsToExecute.add(Subtract); 

foreach(BinaryOp method in methodsToExecute) 
{ 
    method(1,2); 
} 
0

, उन सब आम इंटरफेस के लागू है IExecuteable कहते हैं, और फिर एक सूची < IExecutable>

भी है प्रतिनिधियों का उपयोग कर:

class Example 
{ 
    public delegate int AddDelegate(int x, int y); 

    public List<AddDelegate> methods = new List<AddDelegate>(); 

    int Execute() 
    { 
     int sum = 0; 
     foreach(AddDelegate method in methods) 
     { 
      sum+=method.Invoke(1, 2); 
     } 
     return sum; 
    } 
} 
0

एक सूची < कार्रवाई का उपयोग कर इसे लेकिन आज़माया नहीं < टी >> प्रकार इसे करने में सक्षम होना चाहिए।

3

.NET 3.0 का उपयोग करके आप सामान्य है प्रतिनिधियों।

इस प्रयास करें:

List<Func<int, int, int>> methodsToExecute = new List<Func<int, int, int>>(); 

methodsToExecute.Add(Subtract); 

methodsToExecute.Add[0](1,2); // equivalent to Subtract(1,2) 
+0

क्या यह अंतिम पंक्ति नहीं होनी चाहिए: विधियां टूटेक्स्यूट [0] (1,2); या यहां तक ​​कि बीटर: int n = विधियां करने के लिए [0] (1,2); –

2
List<Func<int, int, int>> n = new List<Func<int, int, int>>(); 
      n.Add((x, y) => x + y); 
      n.Add((x, y) => x - y); 
      n.ForEach(f => f.Invoke(1, 2)); 
1

मैं Khoth के कार्यान्वयन बेहतर पसंद है, लेकिन मैं क्या खड़ी कर रहा है अपने संकलक त्रुटि है कि आप एक BinaryOp को विधि डाली नहीं है इससे पहले कि आप को लागू करने की कोशिश है लगता है। आपके foreach पाश में यह केवल एक "वस्तु" है। खोथ की तरह दिखने के लिए अपना foreach बदलें और मुझे लगता है कि यह काम करेगा।

1

जब भी मुझे ऐसा कुछ करने का लुत्फ उठाना पड़ता है, तो मैंने पाया है कि कमांड पैटर्न का उपयोग करने के लिए आपके डिजाइन को दोबारा सुधारना बेहतर होता है, खासकर जब आपके सभी तरीकों में समान पैरामीटर होते हैं। इस तरह से अधिक लचीलापन के लिए अनुमति देता है।

संबंधित मुद्दे

 संबंधित मुद्दे