2010-06-13 3 views
3

형식을 동적으로 생성하고 TypeBuilder.CreateType을 호출 한 후 새 형식의 메서드를 가리키는 대리자를 만들고 싶습니다. 내가 Reflection.Emit : MethodBuilder를 RuntimeMethodInfo로 안정적으로 변환하는 방법은 무엇입니까?

loadedType = typeBuilder.CreateType(); 
myDelegate = (MyDelegate)Delegate.CreateDelegate(
            typeof(MyDelegate), methodBuilder); 

가 methodInfo로 methodBuilder 재사용과 같은 코드를 사용하는 경우, 나는 예외가 "MethodInfo가 RuntimeMethodInfo해야한다"얻는다. 이제 일반적으로 나는

MethodInfo mi = loadedType.GetMethod(methodBuilder.Name); 
myDelegate = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), mi); 

으로 MethodInfo를 다시 취득 할 수 있습니다하지만 내 클래스는 같은 이름을 가진 여러 오버로드 된 메서드를 포함 할 수있다. 어떻게 내가 올바른 것을 얻을 수 있는지 어떻게 확인합니까? 메서드는 loadedType에서 찾을 수있는 몇 가지 영구 식별자가 있습니까?

업데이트 : 알았습니다. 이제 MethodInfo를 다시 얻으려고합니다. 나는 그것이 모든 경우에 효과가 있음을 확신 할 수 있기를 바란다.

private static MethodInfo ReacquireMethod(Type type, MethodInfo method) 
{ 
    BindingFlags flags = BindingFlags.DeclaredOnly; 
    flags |= (method.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic); 
    flags |= (method.IsStatic ? BindingFlags.Static : BindingFlags.Instance); 
    MethodInfo m = type.GetMethod(method.Name, flags, null, 
              ParameterTypes(method), null); 
    Debug.Assert(m != null); 
    return m; 
} 
+0

'CreateType'이 포함 된 유형 (빌더)에서 호출되는 한 모든 경우에 작동해야합니다. – leppie

답변

3

나는 영구 식별자가 없다는 것을 알고 있습니다.

: 내 생각 엔 당신이 (가) appropriate GetMethod overload에 전달 methodBuilderGetParameters를 호출 한 다음 Type[] 배열로 반환 ParameterInfo[] 배열을 번역해야한다는 것입니다, 그래서

방법의 오버로드는 자신의 매개 변수 목록에 의해 구별된다

MethodInfo mi = loadedType.GetMethod(
    methodBuilder.Name, 
    methodBuilder.GetParameters().Select(p => p.ParameterType).ToArray()); 
+0

나는 오히려 누군가가 이런 종류의 검색을 제안 할 것이라고 생각했다. 상당히 신뢰할 만하지만 100 % 내포하지는 않습니다. 두 가지 과부하가 있다면 그 중 하나가 '밖'이고 다른 하나는 '심판'입니다. – Qwertie

+0

아, C# 컴파일러에서는 'ref'와 'out'만 다른 두 가지 오버로드를 허용하지 않습니다. 아마 당신의 방법은 실제로 100 % 안정적으로 작동 할 것입니다, 나는 그것을 위해 갈 것이라고 생각합니다. 그것은 약간의 고통이지만 .NET 2.0을 사용하고 있습니다. LINQ는 없습니다. – Qwertie

+0

그러나 한 가지 문제는 GetMethod가 공용 메서드 만 가져 오는 것입니다. 안전을 위해 다른 과부하를 사용해야합니다. – Qwertie

0

형식 배열을 사용하는 GetMethod 오버로드를 사용해야합니다. 메소드 과부하는 전달 된 매개 변수로 바인딩을 위해 선택됩니다. 반사를 통해 메타 데이터를 가져올 때 실제로 메서드를 호출하지 않기 때문에, 당신이 바로 MethodInfo 개체를 얻을 Type 객체의 순서 배열을 제공해야합니다 :

MethodInfo mi = loadedType.GetMethod(
    methodBuilder.Name, 
    new[] 
    { 
     typeof(string), 
     typeof(int) 
    } 
); 
:

Type.GetMethod Method (String, Type[])

처럼 사용

Assiming methodBuilder.Name 그 다음 바인딩 것 "MyMethod라는"입니다 :

public <returnType> MyMethod(string param1, int param2); 

반환 형식이 아닌 것을 기억하십시오 메소드 서명의 일부이며 메소드 이름과 매개 변수 유형 만 있습니다.

관련 문제