2011-06-20 10 views
6

मुझे प्रतिनिधियों और सी # भाषा डिजाइन के बारे में कुछ और जानने की जरूरत है।प्रतिनिधि के आमंत्रण की परिणाम सूची कैसे प्राप्त करें?

Let कहते हैं, मैं एक MulticastDelegate कि सामान्य प्रतिनिधि लागू करता है और कई कॉल शामिल है:

Func<int> func = null; 
func += ()=> return 8; 
func +=() => return 16; 
func +=() => return 32; 

अब इस कोड 32 वापस आ जाएगी:

int x = func(); // x=32 

मैं अगर जानना चाहते हैं वहाँ मौजूद है (या बेहतर मुझे पूछना चाहिए कि यह क्यों अस्तित्व में नहीं है!) सी # भाषा सुविधा जिसका उपयोग सभी प्रतिनिधि के आमंत्रण के परिणामों तक पहुंच प्राप्त करना संभव है, जिसका मतलब है सूची ({8,16,32}) प्राप्त करना?

बेशक यह .NET फ्रेमवर्क दिनचर्या का उपयोग करके ऐसा करना संभव है। कुछ इस तरह काम करेंगे:

public static List<TOut> InvokeToList<TOut>(this Func<TOut> func) 
{ 
    var returnValue = new List<TOut>(); 
    if (func != null) 
    { 
     var invocations = func.GetInvocationList(); 
     returnValue.AddRange(invocations.Select(@delegate => ((Func<TOut>) @delegate)())); 
    } 
    return returnValue; 
} 

लेकिन मैं (जब प्रतिनिधियों कर रहे हैं वास्तव में, क्यों MulticastDelegate साधारण नहीं है) प्रणाली है कि वहाँ बेहतर तरीका होना चाहिए, कम से कम कास्टिंग के बिना से बाहर नहीं कर सकते?

+2

MulticastDelegate ढांचे में 1.1 के बाद से किया गया है, जिसका अर्थ है जब यह कोडित किया गया था वहाँ किसी भी जेनरिक उपलब्ध नहीं था: यहाँ एक छोटा सा उदाहरण है। – Will

उत्तर

2

यदि आप Func<int> का उपयोग नहीं करते हैं तो आप जो भी चाहते हैं उसे पूरा कर सकते हैं, लेकिन एक क्रिया जो पैरामीटर के रूप में एक विधि लेती है जो रिटर्न वैल्यू को संसाधित करती है। ', वास्तव में क्यों MulticastDelegate साधारण नहीं है जब प्रतिनिधियों कर रहे हैं'

static Action<Action<int>> OnMyEvent=null; 

    static void Main(string[] args) 
    { 
     OnMyEvent += processResult => processResult(8); 
     OnMyEvent += processResult => processResult(16); 
     OnMyEvent += processResult => processResult(32); 

     var results = new List<int>(); 
     OnMyEvent(val => results.Add(val)); 

     foreach (var v in results) 
      Console.WriteLine(v); 

    } 
+0

अब मैं सूची प्रतिनिधियों के साथ जो चाहता हूं उसे प्राप्त करता हूं ("GetInvocations" के साथ सभी सामानों से बचने के लिए) लेकिन आपका नमूना मुझे अतिरिक्त विचार देता है। धन्यवाद। सोचने का अच्छा तरीका। –

6

नहीं, कोई बेहतर तरीका नहीं है - जब आप मल्टीकास्ट प्रतिनिधि का आह्वान करते हैं, तो परिणाम केवल अंतिम प्रतिनिधि का नतीजा होता है। फ्रेमवर्क स्तर पर यह वही है।

मल्टीकास्ट प्रतिनिधि अधिकतर ईवेंट हैंडलर के लिए उपयोगी हैं। इस तरह के कार्यों के लिए उनका उपयोग करना अपेक्षाकृत दुर्लभ है।

ध्यान दें कि Delegate ही साधारण नहीं है या तो - क्योंकि प्रकार के arity प्रकार के आधार पर बदल सकते हैं केवल व्यक्ति प्रतिनिधि प्रकार, सामान्य हो सकता है। (जैसे Action<T> और Action<T1, T2> असंबंधित प्रकार वास्तव में कर रहे हैं।)

+0

मल्टीकास्टडिलेगेट सार है इसलिए क्या मुझे यह समझने का अधिकार है कि कंक्रीट प्रतिनिधि जैसे एक्शन "कहीं अंदर" विरासत वर्ग (मल्टीकास्टडिलेगेट का बच्चा) उत्पन्न करता है? तो प्रतिनिधि को वापस करने के लिए GetTypedInvocations नई विधि को जोड़ना असंभव क्यों है [] लेकिन एक्शन []? –

+0

@Roman: हां, प्रत्येक विशिष्ट प्रकार उस तरह की अपनी विधि जोड़ सकता है - हालांकि इसे प्रासंगिक सरणी आदि बनाने की आवश्यकता होगी। –

1

ख) के प्रतिनिधियों से वापसी मान, केवल परिणाम सूची में सूँघने से प्राप्त करने के लिए एक) अपवाद कोई तरीका नहीं है। एक और तरीका सिर्फ प्रतिनिधियों की सूची है और इसे मैन्युअल रूप से प्रबंधित करना है।

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

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