gpt4 book ai didi

c# - 使用委托(delegate)调用构造函数

转载 作者:太空狗 更新时间:2023-10-29 20:57:49 25 4
gpt4 key购买 nike

我找到了 this但尝试使用它但失败了。

如何使用反射创建一个对象并通过将其放入委托(delegate)中使其快速?

        DynamicMethod dm = new DynamicMethod("MyCtor", t, new Type[] { });            
var ctor = t.GetConstructor(new Type[] { });
ILGenerator ilgen = dm.GetILGenerator();
ilgen.Emit(OpCodes.Ldarg_0);
ilgen.Emit(OpCodes.Newobj, ctor);
ilgen.Emit(OpCodes.Ret);
var d = (Func<T>)dm.CreateDelegate(t);
dm.Invoke(null, new object[] { });

在将它放入委托(delegate)之前,我尝试至少调用它,当我执行上述操作时,我得到了错误

An unhandled exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll

附加信息:调用的目标抛出了异常。

如果我调用 d() 而不是我得到异常

An unhandled exception of type 'System.ArgumentException' occurred in mscorlib.dll

Additional information: Type must derive from Delegate.

如何将无参数构造函数放入委托(delegate)中并调用它?

最佳答案

如果您可以访问 .NET 3.5(您对 Func<T> 的使用表明),您可能会找到 ExpressionILGenerator 容易:

class Foo { }
static void Main() {
Func<Foo> func = GetCtor<Foo>(); // cache this somewhere!
Foo foo = func();
}
static Func<T> GetCtor<T>() {
Type type = typeof(T);
Expression body = Expression.New(type);
return Expression.Lambda<Func<T>>(body).Compile();
}

很容易扩展它以使用特定的构造函数、传递参数或添加构造函数后的属性绑定(bind);转换、转换等(参见 this related answer )。如果您有特定场景,我很乐意添加示例。

另请注意,您应该缓存并重新使用任何此类构造函数 - 否则您将失去好处(即不要在每次调用时重新创建委托(delegate))。

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

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