형식을 동적으로 생성하고 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;
}
'CreateType'이 포함 된 유형 (빌더)에서 호출되는 한 모든 경우에 작동해야합니다. – leppie