2010-12-06 2 views
16

나는 방법을 원하지만 거기에 하나 이상의 과부하가 있습니다. 예를 들어 객체에서 나는 '같음'을 얻으려고했다. typeof(Object).GetMethod("Equals")를 작성반사 GetMethod. 더 구체적인 방법을 선택

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

를 사용하는 경우 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

아 하! 나는 오버로드를 시도하고 BindingFlags.Instance 만 사용했습니다. 왜 내가 널 (그리고 BindingFlags.Public뿐만 아니라 생각없이) 시도했는지 궁금해. 한 메서드가 메서드를 재정의하는지 확인하여이 메서드를 비교하려고하고 false가 표시되는지 확인하려고합니다. "같음"이 기본과 동일하거나 무시 된 것인지 확인할 수있는 방법이 있습니까? - 편집 - 가난한하지만 쓸만한 쓰기를 시도하고 있습니다. 반사로 비교하십시오. –

+0

@ acidzombie24 : 솔직히 말해서, 나는 확신하지 못합니다. 아마도이 클래스에서 선언 된 메서드를 얻은 다음 기본 클래스에서 선언 된 메서드를 사용하여 해당 메서드가 같은지 여부를 확인할 수 있다고 생각하지만 확실하지 않습니다. –

+0

나는 그들을 비교할 수있을 것 같아 보이지만 나는 .GetBaseDefinition() 그래서 내가 무엇을했는지는베이스에있는 메소드로 이것을 호출했다. 그리고 그 중 하나가 재정의되었는지 알 수있다. –

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

..


공공 재정의 무효 OnResultExecuted (ResultExecutedContext filterContext) { VAR actionName = filterContext.RouteData .Values ​​[ "action"]. 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 
} 

}