2010-12-06 12 views
16

Yöntemi almak istiyorum ancak bir aşırı yüklenme var. Örneğin, nesnede 'Eşittir' almaya çalıştım. typeof(Object).GetMethod("Equals") yazmaYansıma GetMethod. Daha özel bir yöntem seç

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

kullanırken typeof(Object).GetMethod("public virtual bool Equals(object obj)") beni boş var yazarken, bana bir istisna var. Bu durumda hangi yöntemi istediğimi nasıl belirleyebilirim?

cevap

26

Parametre türlerini belirtmenize olanak veren one of the overloads kullanın.

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); 

Veya alternatif: Örneğin

Bu kodu deneyebilirsiniz

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

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

Ah ha! Aşırı çalıştı ve sadece BindingFlags.Instance kullandım. Hiç niçin null olmadığımı merak etmeyin (ve BindingFlags.Public'i kendi başına düşünmeden de denedim). Bir nesnenin bir yöntemi geçersiz kılıp kılmadığını kontrol etmek istiyorum, bu yüzden bu yöntemleri karşılaştırmaya çalışıyorum ve yanlış anlıyorum. "Eşit" in tabanıyla aynı mı yoksa geçersiz kılın mı olduğunu görmemin bir yolu var mı? -edit- Ben bir fakir ama uygun bir karşılaştırma yazmaya çalışıyorum yansıma –

+0

@ acidzombie24: emin değilim, dürüst olmak gerekirse. Sanırım muhtemelen bu sınıfta bildirilen yöntemi, sonra da temel sınıfta beyan edilen yöntemi ve aynı olup olmadıklarını görebiliyorsunuz ... ama emin değilim. –

+0

Onları karşılaştırmak mümkün görünmüyor HOWEVER yazabilirim .GetBaseDefinition() böylece ne yaptım bu yöntemle tabanda aradı ve bana bir kandırılmış veya –

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

..


kamu override void OnResultExecuted (ResultExecutedContext filterContext) { var actionName = filterContext.RouteData Değerler, [ "eylem"] 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 
} 

}