3

在动态生成类型并调用 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;
}
4

2 回答 2

3

据我所知,没有持久的共享标识符。

方法的重载由它们的参数列表来区分,所以我猜你需要调用GetParametersonmethodBuilder然后将返回的ParameterInfo[]数组转换为Type[]数组以传递给适当的GetMethod重载

MethodInfo mi = loadedType.GetMethod(
    methodBuilder.Name,
    methodBuilder.GetParameters().Select(p => p.ParameterType).ToArray());
于 2010-06-13T06:08:21.380 回答
0

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

Type.GetMethod 方法(字符串,Type[])

像这样使用:

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

假设 methodBuilder.Name 是“MyMethod”,这将绑定以下内容:

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

请记住,返回类型不是方法签名的一部分,只有方法名称及其参数类型才是。

于 2010-06-13T06:04:08.093 回答