2012-06-20 23 views
18

के साथ कस्टम ऑपरेटर को कैसे कॉल करें मेरी छोटी परियोजना में मैं निष्पादन योग्य कोड बनाने के लिए System.Reflection कक्षाओं का उपयोग कर रहा हूं। मुझे कस्टम प्रकार के + ऑपरेटर को कॉल करने की आवश्यकता है। क्या कोई जानता है कि मैं सी # प्रतिबिंब का उपयोग कर कस्टम क्लास के कस्टमाइज्ड ऑपरेटर को कैसे कॉल कर सकता हूं?प्रतिबिंब

उत्तर

22

सी # संकलक नाम op_XXXX साथ कार्यों के लिए ऑपरेटर अतिभारित बदल देता जहां XXXX ऑपरेशन है:

operator== ->op_Equality
operator!= ->op_Inequality
operator+ ->op_Addition
operator- ->op_Subtraction
operator< ->op_LessThan
operator> ->op_GreaterThan
operator<= ->op_LessThanOrEqual
operator>= ->op_GreaterThanOrEqual
और इसके आगे।

तो DateTime struct के operator+ विधि को पुनः प्राप्त करने के लिए, आप लिखने की ज़रूरत:

MethodInfo mi = typeof(DateTime).GetMethod("op_Addition", 
    BindingFlags.Static | BindingFlags.Public); 
+1

बस उत्सुक :) क्या मैं एक ही हस्ताक्षर के साथ एक स्थिर 'op_Addition' विधि है या नहीं? –

+1

@ ŞafakGür फिर आपको "टाइप करें" 'कहने वाला एक कंपाइलर त्रुटि मिलेगी, जो पहले से ही पैरामीटर प्रकारों के साथ' op_Addition 'नामक सदस्य को परिभाषित करती है। चूंकि परिभाषित ऑपरेटर विधि का नाम उपरोक्त नाम से बदल दिया गया है, इसलिए आप दोनों एक ही कक्षा में नहीं हो सकते हैं। –

+0

और ऑपरेटर कास्टिंग के लिए नामकरण नियम क्या होगा? – Grx70

1

अपने अनुकूलित ऑपरेटर को Class के property के रूप में बनाने पर विचार करें। और उसके बाद property और reflection तक पहुंचें।

तरह

PropertyInfo pinfo = obj.GetType().GetProperty("CustomOperator", BindingFlags.Public | BindingFlags.Instance); 
string customOperator = pinfo.GetValue(obj,null) as string; 
6
typeof(A).GetMethod("op_Addition").Invoke(null, instance1, instance2);