Activator.CreateInstance 的替代方案





5.00/5 (4投票s)
Activator.CreateInstance 的一种替代方案
我发现通过反射实例化具有默认构造函数的对象最快的方法是使用 DynamicMethod
类。以下是我编写的一个辅助类,可以轻松地使用反射实例化对象。
public class DynamicInitializer
{
public static V NewInstance<V>() where V : class
{
return ObjectGenerator(typeof(V)) as V;
}
private static object ObjectGenerator(Type type)
{
var target = type.GetConstructor(Type.EmptyTypes);
var dynamic = new DynamicMethod(string.Empty,
type,
new Type[0],
target.DeclaringType);
var il = dynamic.GetILGenerator();
il.DeclareLocal(target.DeclaringType);
il.Emit(OpCodes.Newobj, target);
il.Emit(OpCodes.Stloc_0);
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Ret);
var method = (Func<object>)dynamic.CreateDelegate(typeof(Func<object>));
return method();
}
public static object NewInstance(Type type)
{
return ObjectGenerator(type);
}
}
你可以使用两种方法调用 NewInstance
:NewInstance<V>()
,NewInstance(Type type)
。