gpt4 book ai didi

c# - Reflection.Emit:如何可靠地将 MethodBuilder 转换为 RuntimeMethodInfo?

转载 作者:行者123 更新时间:2023-11-30 16:33:34 26 4
gpt4 key购买 nike

动态生成类型并调用 TypeBuilder.CreateType 后,我想创建一个指向新类型中方法的委托(delegate)。但是如果我使用像

这样的代码
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;
}

最佳答案

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

方法的重载通过它们的参数列表来区分,所以我猜你需要调用 GetParametersmethodBuilder 上,然后将返回的 ParameterInfo[] 数组转换为 Type[] 数组以传递给 appropriate GetMethod overload :

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

关于c# - Reflection.Emit:如何可靠地将 MethodBuilder 转换为 RuntimeMethodInfo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3031183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com