2010-01-08 15 views
25

के लिए प्रतिनिधि मैं एक स्थैतिक विधि का प्रतिनिधि बनने की कोशिश कर रहा हूं जो एक रेफरी तर्क लेता है। कृपया मत पूछो कि मैं ऐसी कॉकमामी चीज़ क्यों कर रहा हूं। यह सीखने का एक हिस्सा है कि कैसे नेट, सी #, और प्रतिबिंब काम और इसे अनुकूलित करने के लिए कैसे।एक्शन < ref T1, T2>

मेरे कोड है:

public struct DataRow 
    { 

     private double t; 
     static public void Cram_T(ref DataRow dr, double a_t) 
     { 
      dr.t = a_t; 
     } 
    } 
'''' 
    Type myType = typeof(DataRow); 
    MethodInfo my_Cram_T_Method = myType.GetMethod("Cram_T"); 
    var myCram_T_Delegate = 
     Delegate.CreateDelegate(typeof(Action<DataRow, Double>),  
           my_Cram_T_Method) 
           as Action<DataRow, Double>; 

इसका कारण यह है (मुझे लगता है कि) मेरे एक बाध्यकारी त्रुटि देता है सामान्य कार्रवाई विधि से मेल नहीं खाता।

var myCram_T_Delegate = 
     Delegate.CreateDelegate(typeof(Action<ref DataRow, Double>),   
           my_Cram_T_Method) 
           as Action<ref DataRow, Double>; 

लेकिन इस संकलन नहीं होगा:

घड़ी विंडो में Cram_T_Method का मूल्य निरीक्षण

{Void Cram_T(DataRow ByRef, Double)} 

मैं तो कार्रवाई में रेफरी कीवर्ड उपयोग करने की कोशिश देता है। सी # कंपाइलर टोकन "रेफरी" पर चोक करता है।

इस प्रतिनिधि को बनाने का सही तरीका क्या है?

उत्तर

33

अपने स्वयं के प्रतिनिधि प्रकार बनाएँ:

delegate void MyAction(ref DataRow dataRow, double doubleValue); 

और Action<ref DataRow, Double> के स्थान पर MyAction का उपयोग करें - जो, जैसा कि आप का उल्लेख किया गया है, संकलन नहीं है।

+0

कौन सा भीतरी विधि के लिए सीमाओं लाता है:

Type refInt = typeof(int).MakeByRefType(); Type refIntList = typeof(List<>).MakeGenericType(refInt); 

एक त्रुटि फेंकता: मैं बस यह कोशिश की है रों। – Bitterblue

21

@Ben एम सही विचार है, हालांकि आप इसे अधिक सामान्य बना सकता है:

public delegate void RefAction<T1, T2>(ref T1 arg1, T2 arg2) 

समस्या जैसे प्रतिनिधियों के साथ कोई संबंध नहीं है - यह सिर्फ इतना है कि आप ref उपयोग नहीं कर सकते जब आपके द्वारा निर्दिष्ट है एक प्रकार का तर्क।

सिद्धांत में "यह रेफरी या नहीं है" प्रकार की जानकारी का हिस्सा है (इसलिए Type.IsByRef) लेकिन आप इसे इस तरह निर्दिष्ट नहीं कर सकते हैं।

सच कहूं मैं बिल्कुल यकीन है कि क्या हुआ अगर आप प्रतिबिंब के माध्यम से एक List<ref int> बनाने की कोशिश की क्या होगा, उदाहरण के लिए नहीं कर रहा हूँ - मैं आशा कि एक अपवाद फेंका किया जाएगा ... यह एक बहुत ही समझदार अवधारणा नहीं है जाएगा :)

संपादित करें:

Unhandled Exception: System.ArgumentException: The type 'System.Int32&' may 
not be used as a type argument. 
+4

टाइप तर्क टाइप प्रकार होना चाहिए जिनके मान ऑब्जेक्ट में परिवर्तनीय हैं। प्रबंधित और अप्रबंधित सूचक प्रकार उस आवश्यकता को पूरा नहीं करते हैं। –

+1

ठीक है मैं कभी नहीं। चित्त आकर्षण करनेवाला। एक बार के लिए, मुझे नहीं लगता कि यह गहराई में सी # में शामिल होगा। शायद एक नोट के रूप में ... –

+0

यह काम करता है लेकिन सूची कमेंट्री अप्रासंगिक है। सार्वजनिक प्रतिनिधि शून्य रेफजेनएक्शन (रेफरी टी 1 arg1, टी 2 arg2); var myCram_TDelegate = Delegate.CreateDelegate (Typeof (RefGenAction ), myType.GetMethod ("Cram_T")) RefGenAction ; –

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