C# Emit:如何将MethodBuilder可靠地转换为RuntimeMethodInfo?

C# Emit:如何将MethodBuilder可靠地转换为RuntimeMethodInfo?,c#,.net,reflection,reflection.emit,C#,.net,Reflection,Reflection.emit,在动态生成类型并调用TypeBuilder.CreateType之后,我想创建一个指向新类型中方法的委托。但是如果我使用这样的代码 loadedType = typeBuilder.CreateType(); myDelegate = (MyDelegate)Delegate.CreateDelegate( typeof(MyDelegate), methodBuilder); 将methodBuilder作为methodIn

在动态生成类型并调用TypeBuilder.CreateType之后,我想创建一个指向新类型中方法的委托。但是如果我使用这样的代码

loadedType = typeBuilder.CreateType();
myDelegate = (MyDelegate)Delegate.CreateDelegate(
                                  typeof(MyDelegate), methodBuilder);
将methodBuilder作为methodInfo重用,我得到了异常“methodInfo必须是RuntimeMethodInfo”。现在,通常我可以使用重新获取MethodInfo

MethodInfo mi = loadedType.GetMethod(methodBuilder.Name);
myDelegate = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), mi);
但是我的类可能包含几个同名的重载方法。我如何确保我得到了正确的答案?方法是否有可以在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;
}

您需要使用获取类型数组的GetMethod重载。方法重载由传递给它们的参数选择绑定。由于在通过反射获取方法的元数据时实际上没有调用方法,因此必须提供类型对象的有序数组以获取正确的MethodInfo对象:

用法如下:

MethodInfo mi = loadedType.GetMethod(
    methodBuilder.Name, 
    new[] 
    { 
        typeof(string), 
        typeof(int) 
    }
);
Assiming methodBuilder。名称为“MyMethod”,将绑定以下内容:

public <returnType> MyMethod(string param1, int param2);
publicMyMethod(字符串param1,int param2);

请记住,返回类型不是方法签名的一部分,只有方法名称及其参数类型是。据我所知,没有持久共享标识符

方法的重载通过其参数列表来区分,因此我猜您需要调用
methodBuilder
,然后将返回的
ParameterInfo[]
数组转换为
类型[]
数组,以传递给:


我还以为有人会建议进行这种查找。虽然它不是100%可靠,但我认为,因为如果你有两个重载,它们之间的唯一区别是一个是'out'和一个是'ref'?啊,C#编译器不允许两个重载只由'ref'和'out'不同。也许你的方法真的能100%可靠地工作,我想我会努力的。不过这有点痛苦,因为我使用的是.NET2.0-没有LINQ。不过有一个问题,GetMethod只获取公共方法。为了安全,我应该换个超负荷的。哦!这不是100%可靠的-在CIL中,方法可以在返回类型上重载(或者我在上读到的那样),并基于自定义修饰符()@Qwertie:如果这影响到您,那么我想您需要调用
GetMethods
,然后使用参数、返回类型过滤返回的
MethodInfo[]
数组,修饰符等,直到您开始使用单个方法。只要对包含的类型(生成器)调用了
CreateType
,它就应该在所有情况下都能工作。
MethodInfo mi = loadedType.GetMethod(
    methodBuilder.Name,
    methodBuilder.GetParameters().Select(p => p.ParameterType).ToArray());