2008-12-11 12 views
13

के अंदर एक प्रतिनिधि प्रकार बनाना मैं बेनामी विधियों के उद्देश्य के लिए एक विधि के अंदर सी # में एक प्रतिनिधि प्रकार बनाना चाहता हूं।एक विधि

उदाहरण के लिए:


public void MyMethod(){ 
    delegate int Sum(int a, int b); 

    Sum mySumImplementation=delegate (int a, int b) {return a+b;} 

    Console.WriteLine(mySumImplementation(1,1).ToString()); 
} 

दुर्भाग्य से, मैं उस में .NET 2.0 और # 2.0 सी नहीं कर सकते।

उत्तर

17

आप विधि के भीतर प्रतिनिधि प्रकार क्यों बनाना चाहते हैं? विधि के बाहर इसे घोषित करने में क्या गलत है? असल में, आप यह नहीं कर सकते - आप एक विधि के भीतर (किसी भी प्रकार का प्रकार) घोषित नहीं कर सकते हैं।

एक वैकल्पिक सभी समारोह/कार्रवाई सामान्य प्रतिनिधियों जो .NET 3.5 में मौजूद हैं घोषित करने के लिए हो सकता है - तो तुम सिर्फ कर सकता है:

public void MyMethod(){ 
    Func<int, int, int> mySumImplementation = 
     delegate (int a, int b) { return a+b; }; 

    Console.WriteLine(mySumImplementation(1,1).ToString()); 
} 

घोषणाओं मेरी C#/.NET Versions page पर हैं।

+8

"क्यों आप विधि के भीतर प्रतिनिधि प्रकार बनाने के लिए करना चाहते हैं" - क्योंकि प्रतिनिधि प्रकार का उपयोग करने वाली एकमात्र चीज विधि के भीतर परिभाषित कॉलबैक है, इसलिए विधि के बाहर विधि के लिए अवधारणात्मक रूप से स्थानीय चीजें फैलती हैं ... icky। –

13

प्रतिनिधि प्रकार को फ़ंक्शन के बाहर परिभाषित किया जाना है। वास्तविक प्रतिनिधि को विधि के अंदर बनाया जा सकता है जैसा आप करते हैं।

class MyClass { 
    delegate int Sum(int a, int b); 
    public void MyMethod(){ 

     Sum mySumImplementation=delegate (int a, int b) {return a+b;} 

     Console.WriteLine(mySumImplementation(1,1).ToString()); 
    } 

} 

मान्य होगा। आप

delegate R Func<R>(); 
delegate R Func<T, R>(T t); 
delegate R Func<T0, T1, R>(T0 t0, T1 t1); 
delegate R Func<T0, T1, T2, R>(T0 t0, T1 t1, T2 t2); 

तब: सबसे अच्छा समाधान .NET3.5 अनुकरण करने के लिए, और दुनिया भर में कुछ सामान्य प्रतिनिधि प्रकार बना है, जो सभी अपने समाधान पर इस्तेमाल किया जा सकता है, के लिए सब कुछ के लिए लगातार redeclare प्रतिनिधि प्रकार से बचने के लिए किया जा सकता है उपर्युक्त कोड में केवल Func<int, int, int> प्रतिनिधि का उपयोग कर सकते हैं।

4

प्रतिनिधियों को कक्षाओं में संकलित किया जाता है (एक वर्ग जो सिस्टम से प्राप्त होता है। मल्टीकास्टडिलेगेट)। सी # में, आपको किसी विधि के अंदर कक्षा घोषित करने की अनुमति नहीं है (सी # भाषा विनिर्देश देखें)। इस प्रकार आप किसी विधि में एक प्रतिनिधि को घोषित नहीं कर सकते हैं।

0

क्या इस बारे में:

static void Main(string[] args) 
{ 
    Expression<Func<int, int, int>> exFunc = (a, b) => a + b; 
    var lambda = exFunc as LambdaExpression; 
    Delegate del = exFunc.Compile(); 
    Console.WriteLine(del.DynamicInvoke(2, 2)); 
} 
संबंधित मुद्दे