我找到了
this,但试图使用它并失败了.
如何使用反射创建对象并通过将其置于委托中来加快速度?
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[] { });
在把它删除之前我试图至少调用它,当我在上面做的时候我得到了错误
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.
解决方法
如果您可以访问.NET 3.5(使用Func< T>建议),您可能会发现Expression比ILGenerator更容易:
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(); }
很容易扩展它以使用特定的构造函数,传递参数或添加post-constructor属性绑定;演员,转换等(见this related answer).如果你有一个特定的场景,我会很乐意添加一个例子.