代码之家  ›  专栏  ›  技术社区  ›  Wes Haggard

获取类型的默认构造函数的最有效方法

  •  63
  • Wes Haggard  · 技术社区  · 17 年前

    获取System.Type的默认构造函数(即没有参数的实例构造函数)最有效的方法是什么?

    我在想下面的代码,但似乎应该有一个更简单更有效的方法。

    Type type = typeof(FooBar)
    BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
    type.GetConstructors(flags)
        .Where(constructor => constructor.GetParameters().Length == 0)
        .First();
    
    5 回复  |  直到 17 年前
        1
  •  140
  •   Curt Hagenlocher    17 年前
    type.GetConstructor(Type.EmptyTypes)
    
        2
  •  31
  •   Community Mohan Dere    9 年前

    如果你真的 需要 ConstructorInfo对象,然后请参见 Curt Hagenlocher's answer .

    System.Type 看见 System.Activator.CreateInstance --它不仅仅是经得起未来考验的(Activator处理的细节比 ConstructorInfo.Invoke ),也是 不那么难看。

        3
  •  4
  •   DaFlame    13 年前

    如果您有泛型类型参数,那么Jeff Bridgman的答案是最好的。 Activator.CreateInstance(Type) 就像亚历克斯·莱曼建议的那样,但有人告诉我这很慢(不过我个人并没有对它进行分析)。

    但是,如果您发现自己非常频繁地构造这些对象,那么有一种更有效的方法使用动态编译的Linq表达式:

    using System;
    using System.Linq.Expressions;
    
    public static class TypeHelper
    {
        public static Func<object> CreateDefaultConstructor(Type type)
        {
            NewExpression newExp = Expression.New(type);
    
            // Create a new lambda expression with the NewExpression as the body.
            var lambda = Expression.Lambda<Func<object>>(newExp);
    
            // Compile our new lambda expression.
            return lambda.Compile();
        }
    }
    

    只需给返回给您的代表打电话。您应该缓存该委托,因为不断地重新编译Linq表达式可能会很昂贵,但是如果您缓存该委托并每次重新使用它,它可能会非常快!我个人使用按类型索引的静态查找词典。当您处理可能只知道类型信息的序列化对象时,此函数非常有用。

        4
  •  2
  •   Jeff B    13 年前

    T NewItUp<T>() where T : new()
    {
       return new T();
    }
    
        5
  •  -2
  •   Mohamed Faramawi    17 年前

    您可能希望尝试FormatterServices.GetUninitializedObject(类型)

    但是,此方法不调用对象构造函数,因此如果在那里设置初始值,则此方法将不起作用 检查MSDN以了解这件事 http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatterservices.getuninitializedobject.aspx

    这里还有另一条路 http://www.ozcandegirmenci.com/post/2008/02/Create-object-instances-Faster-than-Reflection.aspx

    希望这有帮助