2010-12-06 13 views
16

मैं विधि प्राप्त करना चाहता हूं लेकिन एक और अधिभार अधिक है। उदाहरण के लिए ऑब्जेक्ट में मैंने 'बराबर' पाने की कोशिश की। जबप्रतिबिंब GetMethod। एक और विशिष्ट विधि का चयन करें

public virtual bool Equals(object obj); 
    public static bool Equals(object objA, object objB); 

का उपयोग कर typeof(Object).GetMethod("Equals") लेखन मुझे एक अपवाद है, लेखन typeof(Object).GetMethod("public virtual bool Equals(object obj)") मुझे अशक्त हो गया। मैं इस मामले में कौन सी विधि चाहता हूं मैं कैसे निर्दिष्ट करूं?

उत्तर

26

उपयोग one of the overloads आप पैरामीटर प्रकार निर्दिष्ट करने देती है।

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

var staticMethod = typeof(Object).GetMethod("Equals", 
     BindingFlags.Static | BindingFlags.Public, 
     null, 
     new Type[] { typeof(object), typeof(object) }, 
     null); 

var instanceMethod = typeof(Object).GetMethod("Equals", 
     BindingFlags.Instance | BindingFlags.Public, 
     null, 
     new Type[] { typeof(object) }, 
     null); 

या वैकल्पिक रूप से:

var staticMethod = typeof(Object).GetMethod("Equals", 
     new Type[] { typeof(object), typeof(object) }); 

var instanceMethod = typeof(Object).GetMethod("Equals", 
     new Type[] { typeof(object) }); 
+0

आह हा! मैंने अधिभार की कोशिश की और केवल बाध्यकारीफ्लैग का उपयोग किया। इंस्टेंस। कोई आश्चर्य नहीं कि मुझे शून्य क्यों मिला (और मैंने बिना बाध्यकारी बाध्यकारीफ्लैग्स.पब्लिक भी कोशिश की)। मैं यह जांचना चाहता हूं कि एक ऑब्जेक्ट एक विधि को ओवरराइड करता है, इसलिए मैं इन विधियों की तुलना करने की कोशिश कर रहा हूं और मुझे झूठा लगता है। क्या मेरे पास यह देखने का कोई तरीका है कि "बराबर" इसके आधार के समान है या ओवरराइड किया गया है? -edit- मैं एक गरीब लिखने की कोशिश कर रहा हूं लेकिन प्रतिबिंब –

+0

@ एसिडज़ॉम्बी 24 द्वारा उपयुक्त तुलना: मैं निश्चित नहीं हूं, ईमानदार होना। मुझे लगता है कि आप शायद इस वर्ग में घोषित विधि प्राप्त कर सकते हैं, और फिर बेस क्लास पर घोषित विधि, और देखें कि वे वही हैं ... लेकिन मुझे यकीन नहीं है। –

+0

मैं उनसे तुलना करने में सक्षम नहीं हूं, हालांकि मैं लिख सकता हूं। गेटबेस डीफिनिशन() तो मैंने जो किया वह इसे आधार में विधि के साथ बुलाया गया था और मुझे यह बताना चाहिए कि अगर कोई ओवरराइड किया गया था या नहीं –

5
MethodInfo methodInfo = typeof(object).GetMethod("Equals", new Type[] { typeof(object), typeof(object) }); 
0

आप इस कोड की कोशिश कर सकते ..


सार्वजनिक ओवरराइड शून्य OnResultExecuted (ResultExecutedContext filterContext) { वर actionName = filterContext.RouteData .Values ​​[ "कार्रवाई"] ToString()।;

var ctlr = filterContext.Controller as Controller; 
if (ctlr == null) return; 
var invoker = ctlr.ActionInvoker as ControllerActionInvoker; 
if (invoker == null) return; 

var invokerType = invoker.GetType(); 
var getCtlrDescMethod = invokerType.GetMethod("GetControllerDescriptor", BindingFlags.NonPublic | BindingFlags.Instance); 
var ctlrDesc = getCtlrDescMethod.Invoke(invoker, new object[] {ctlr.ControllerContext}) as ControllerDescriptor; 

var findActionMethod = invokerType.GetMethod("FindAction", BindingFlags.NonPublic | BindingFlags.Instance); 
var actionDesc = findActionMethod.Invoke(invoker, new object[] { ctlr.ControllerContext, ctlrDesc, actionName }) as ReflectedActionDescriptor; 
if (actionDesc == null) return; 

if (actionDesc.MethodInfo.ReturnType == typeof (ActionResult)) 
{ 
    // you're in 
} 

}

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