2009-06-02 6 views
1

문제의 불쌍한 explaination 죄송합니다. 문제는리플렉션을 통해 구체적인 클래스에서 Delegate (Func) 구현을 가져 오겠습니까?

완전히 다시 작성 질문

나는 다음과 같은 방법을 가지고 :

그래서 내가 원하는 델리게이트 (searchMethod) 및 개체 (spec) 대리인을 호출합니다. 메서드를 호출 할 때 searchMethod가 호출 할 메서드에서 사용자 지정 특성을 찾으려면 개체 (spec)를 검사하고 싶습니다.

희망이 더 명확합니다.

감사

+0

나는 당신의 조각이 이해가 잘 모르겠어요? ... 어디에서 'T'라고 말했는지 'TSearch'를 참조 할 의향이 있습니까? – jerryjvl

+0

당신이 의미하는 것이 분명하지 않습니다. 첫 번째 선언은 무엇을 의미합니까? 그 뒤에 제약이있는 방법? TSearch 란 무엇입니까? mySearchSpec은 변수 선언을위한 것입니까? 어떤 "구체적인 구현"을 검사 하시겠습니까? –

+0

* 여기서 *는 사용 된 속성입니까? 설명해 주시겠습니까? –

답변

1

. 수정 된 질문을 바탕으로
: 그렇지 않으면 당신은 GetCustomAttributes

부록에 대해 다른 과부하가 필요할 수는 mySearchSpec 타입이 공개된다고 가정

object[] attrs = typeof(mySearchSpec).GetCustomAttributes(false); 

이 들어

는 같은 것을 사용 , 실제 유형의 메소드에 대한 속성을 얻으려면 spec

Type t = spec.GetType(); 
MethodInfo m = t.GetMethod("nameOfMethodToBeCalledHere"); 
object[] attrs = m.GetCustomAttributes(false); 

실제 클래스의 구현에 따라 GetMethod 또는 GetCustomAttributes에 오버로드가 필요할 수도 있습니다.

참고 :
당신이 return searchMethod(spec);에서 호출하는 방법을 요청 할 수처럼 그러나 보이지 않지만, 그 searchMethod과 전혀 spec에 대한 몇 가지 방법입니다.

당신이 searchMethod의 특성 (아무것도 spec와 함께 할)하려면 다음

+0

답장을 보내 주셔서 감사합니다, 나는 내 질문에 명확하지 않았다 : 나는 실제로 searchMethod 호출하는 사양 메서드에서 사용자 지정 특성을 얻으려고. –

+0

다시 한 번 감사드립니다 ... 내 정확한 문제가 searchMethod Func에서 "nameOfMethodToBeCalledHere"가되었습니다. searchMethod.Method.Name은 백업 필드 항목으로 채워집니다. ( –

+0

하나의 속성으로 타겟을 오버 슈팅했습니다. 내 최신 노트를 참조하십시오.) – jerryjvl

0

이 꽤 혼란 질문은 ...

MethodInfo m = searchMethod.Method; 
object[] attrs = m.GetCustomAttributes(false); 

내가 지금 의미의 모든 순열을 다루고 있다고 생각 보자 내가 맞다면

  • searchMethod 라 불리는 람다 함수가있다.

    [MyCustomAttribute] 
    public RetClass MyMethod(SearchSpecification input) { 
        return input.GetRetClass(); 
    } 
    

    그리고 당신은이 메서드를 호출 :

    var result = FindCached(MyMethod); 
    

  • 당신은 그래서 당신은 같은 곳 방법을 객체 생성 된 공장 패턴이

spec라는이 FindCached에서 MyCustomAttribute을 찾으려면 @ jerryjvl의 대답이 맞습니다.

var result = FindCached(x => x.GetRetClass()); 

나는 그것이 당신이 실제로 원하는 x.GetRetClass()에 속성의 여부를 귀하의 설명에서 확실하지 않다 :

귀하의 문제는 당신이 또한 할 수 있다는 것입니다. 이 경우 표현식을 사용하여 람다를 분리해야하지만 권장하지는 않습니다. 더 복잡한 람다 선언은 런타임에 구문 분석을 시도 할 때 블랙 박스 인 익명의 대리자가됩니다.

var result = FindCached("GetRetClass"); 
0
내가 비슷한 상황에 달렸다

, jerryjvl의 대답 : 어쨌든 반사를 사용하고 같은

대신, 당신이 대신 대리인 참조의 메서드의 이름을 전달하는 것이 더 쉬울 수 있습니다 내가 원한 정확하게 설명했다.

일반적인 프로파일 링 방법을 만들려고했습니다. 여기서 메소드를 실행하는 데 걸린 시간을 측정하고 로깅을 위해 리플렉션을 사용하여 메소드의 이름을 검색 할 수있었습니다.

MethodInfo가 핵심이었습니다. 내가 좋아하는 방법이

: 다음

public static bool TimeMethod(Func<bool> someMethod) 

그리고 나중에 내가 동적으로 이름 또는 해제 일부 속성이다 싶어.

MethodInfo m = someMethod.Method; 
object[] attrs = m.GetCustomAttributes(typeof(MonitoringDescriptionAttribute), true); 
string name = m.Name; 

건배