gpt4 book ai didi

c# - 从构造函数创建委托(delegate)

转载 作者:太空狗 更新时间:2023-10-30 00:11:41 25 4
gpt4 key购买 nike

使用反射,我正在尝试从无参数构造函数创建委托(delegate),如下所示:

Delegate del = GetMethodInfo( () => System.Activator.CreateInstance( type ) ).CreateDelegate( delType );

static MethodInfo GetMethodInfo( Expression<Func<object>> func )
{
return ((MethodCallExpression)func.Body).Method;
}

但是我得到了这个异常(exception): “无法绑定(bind)到目标方法,因为它的签名或安全透明度与委托(delegate)类型不兼容。”什么会起作用?

请注意 CreateDelegate自上一版本的 .NET 以来,至少对于此配置文件已被移动。现在在 MethodInfo 上。

最佳答案

正如 phoog 指出的那样,构造函数不会“返回”一个值;另外,您可以使用 ConstructorInfo 而不是 MethodInfo 获取有关它的信息;这意味着您不能直接围绕它创建委托(delegate)。您必须创建调用构造函数并返回值的代码。例如:

var ctor = type.GetConstructor(Type.EmptyTypes);
if (ctor == null) throw new MissingMethodException("There is no constructor without defined parameters for this object");
DynamicMethod dynamic = new DynamicMethod(string.Empty,
type,
Type.EmptyTypes,
type);
ILGenerator il = dynamic.GetILGenerator();

il.DeclareLocal(type);
il.Emit(OpCodes.Newobj, ctor);
il.Emit(OpCodes.Stloc_0);
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Ret);

var func = (Func<object>)dynamic.CreateDelegate(typeof(Func<object>));

当然,如果你在编译时不知道类型那么你只能处理Object...

关于c# - 从构造函数创建委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10593630/

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