使用委托调用构造函数
我发现这个但尝试使用它但失败了。
如何使用反射创建对象并通过将其放入委托中来使其快速?
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[] { });
在将其放入 deleage 之前,我至少尝试调用它,当我执行上述操作时,我收到错误
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.
如何将无参数构造函数放入委托中并调用它?
I found this but tried to use it and failed.
How can i create an object using reflections and make it fast by putting it in a 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[] { });
Before putting it in a deleage i tried to at least invoke it and when i did above i get the error
An unhandled exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
Additional information: Exception has been thrown by the target of an invocation.
If i call d() instead i get the exception
An unhandled exception of type 'System.ArgumentException' occurred in mscorlib.dll
Additional information: Type must derive from Delegate.
How do i put a no param constructor into a delegate and call it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果您可以访问 .NET 3.5(您使用
Func
建议这样做),您可能会发现Expression
比ILGenerator
更容易:易于扩展以使用特定的构造函数、传递参数或添加构造函数后属性绑定;转换、转换等(请参阅此相关答案)。如果您有特定的场景,我很乐意添加一个示例。
另请注意,您应该缓存并重用任何此类构造函数 - 否则您将失去好处(即不要在每次调用时重新创建委托)。
If you have access to .NET 3.5 (which your use of
Func<T>
suggests), you may findExpression
easier thanILGenerator
:Pretty easy to extend that to use a specific constructor, passing arguments, or adding post-constructor property bindings; casts, conversions, etc (see this related answer). If you have a specific scenario, I'll happily add an example.
Note also that you should cache and re-use any such constructors - otherwise you lose the benefit (i.e. don't recreate the delegate per-call).
试试这个 -
Try this -
构造函数没有参数,因此您不应在堆栈上加载参数
ilgen.Emit(OpCodes.Ldarg_0)
:There are no arguments to the constructor so you should not load arguments on the stack
ilgen.Emit(OpCodes.Ldarg_0)
:构造委托的通用方法,直接调用构造函数。
自动搜索具有给定委托类型签名的给定类型的构造函数并构造该类型的委托。此处的代码:
是 Yappi 项目源代码的一部分。使用它,您可以构造委托,调用给定类型的任何构造函数,包括带参数的构造函数(除了 ref 和 out 参数)。
示例用法:
构造委托后,将其存储在静态字典中或具有泛型参数的类的静态字段中的某个位置。不要每次都构建新的委托。使用一个委托来构造给定类型的多个实例。
Generic method for constructing delegates, calling constructor directly.
Automatically searches constructor in given type with signature of given delegate type and constructs delegate of that type. Code here:
is part of Yappi project's sources. Using it you can construct delegate calling any constructor of given type, including constructor with parameters (except ref and out parameters).
Sample usage:
After construction of delegate, store it somewhere in static dictionary or in static field of class with generic parameter. Don't construct new delegate each time. Use one delegate for constructing multiple instances of given type.