2013-01-14 4 views
4

에서 매개 변수로 반환 형식 비슷한 질문이 여기에있다 :패스 방법/C 번호

Pass Method as Parameter using C#

가정 당신은 메소드의 인수를 알고 유형을 반환합니다. 조금 다른 것을하고 싶습니다. 내가 대신 람다 기능을 소요하는 System.Reflection의 .GetMethod (문자열)의 버전을 만들 찾고 있어요 - 그래서 대신 :

MethodInfo methodInfo = ReflectionHelper.GetMethod<MyClass>(mc => mc.AddThing); 
:

MethodInfo methodInfo = typeof(MyClass).GetMethod("AddThing"); 

내가 더 컴파일 안전을 사용할 수 있습니다 나는 t 모르는 제외

public static MethodInfo GetMethod<T, TReturn>(Expression<Func<T, Func<TArg, TReturn>>> expr) 
{ 
    return ((MethodCallExpression)expr.Body).Method; 
} 

: 예를 들어이 인수 없었다 경우 문자열을 반환 - ReflectionHelper는 인수의 수를 알고 간단한 틱 것 해답를 미리 형식을 반환 그렇다면

그는 인수 카운트/반환 유형을 미리 알고, 나는 모든 것을 커버하는 20 가지 오버로드로 스팸 메일을 피하고 싶습니다.

그렇다면 어떻게해야합니까?

+0

'동적 인'도움이 될까요? – Johnny5

+0

인수를 모르는 경우 메서드에 전달하려고 시도하는 대상을 받아들입니다. – Servy

+0

@ Johnny5 어떻게 보이지 않습니다. 그것은 여전히 ​​호출 될 때 고정 된 서명을 필요로하거나 최소한 제공되는 인수를 준수하는 서명을 필요로합니다. – Servy

답변

3

람다 mc => mc.AddThing에 메소드를 지정하지 않았습니다. 메소드 그룹을 지정했습니다.

당신이 할 수있는 것은 표현식에 메소드 호출을 작성하는 것입니다. 실행되지는 않을 것이기 때문에 매개 변수가 원하는 과부하를 지정해야합니다.

그래서

, 그것을 사용하는, 당신이 작성합니다

MethodInfo mi = GetMethod<MyClass>(mc => mc.AddThing(null)); 

가 그런 식 그냥 Action 아닌 Func 수 : 표현 검사와 마찬가지로 항상

public static MethodInfo<T>(Expression<Action<T>> expr) 
{ 
    return ((MethodCallExpression) x.Body).Method; 
} 

이는 경향이있다 람다가 예상 된 형식이 아니지만 "마법"문자열을 제거하는 올바른 방향의 단계입니다.

+0

올바른 방향으로 나아가는 단계입니다. 메소드를 지정하기 위해 가짜 인수를 전달하는 것을 싫어합니다. 주어진 입력에 다소 간단하지만 IDE에서 더 많은 도움이 필요합니다. 불행히도 아무 대답도 내 목표에 달하지 않습니다. –

0

내가 전화 할게 것을, 지금 사용하고 해결 방법 "스팸 접근,"시나리오의 제한된 세트의 추악한하지만 작동 :

public class ReflectionHelper<T> 
{ 
    public MethodInfo GetMethod<TA1>(Expression<Func<T, Func<TA1>>> expr) 
    { 
     return ((MethodCallExpression)expr.Body).Method; 
    } 
    public MethodInfo GetMethod<TA1, TA2>(Expression<Func<T, Action<TA1, TA2>>> expr) 
    { 
     return ((MethodCallExpression)expr.Body).Method; 
    } 
    public MethodInfo GetMethod<TA1, TA2, TA3>(Expression<Func<T, Action<TA1, TA2, TA3>>> expr) 
    { 
     return ((MethodCallExpression)expr.Body).Method; 
    } 
    . . . // And more 
} 

을 그리고 그것은을 지정, 계속 다양한 인수 카운트를 가진 잠재적 인 Action 및 Funcs의 긴 목록. - 난 그냥 이름으로 메소드를 호출 얻을, 나는 그렇게하기 위해 가짜 인수를 전달하지 않도록,하지만 난 여전히 얻을 그래서

(new ReflectionHelper<MyClass>()).GetMethod<string>(mc => mc.SaySomething).Invoke("Hi"); 

그것을 가까이 틱의 :이 같은 사실에서 사용 날 수 있습니다 그 주장의 유형이 내가 바라던 것보다 더 복잡한 것을 내놓았다. 그러나 동일한 이름의 여러 메소드 오버로드가있는 상황에서 인수 유형을 전달하면 메소드 목록이 하나의 특정 오버로드로 좁혀집니다.

나는 여전히 내 질문과 같이 방법을 사용할 수있는 더 단순한 것에 관심이 있습니다. 메서드 오버로드 상황에서는 모호합니다. 표준 .GetMethod (문자열)도 마찬가지입니다.