65.9K
CodeProject 正在变化。 阅读更多。
Home

Activator.CreateInstance 的替代方案

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2012 年 1 月 25 日

CPOL
viewsIcon

60690

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);
        }
    }

你可以使用两种方法调用 NewInstanceNewInstance<V>()NewInstance(Type type)

© . All rights reserved.