最有效的方式来获得一个类型的默认构造函数(Most efficient way to get def

2019-08-06 04:18发布

什么是最有效的方式来获得的System.Type的默认构造函数(即构造函数不带参数)?

我在想的东西沿下面的代码行,但好像应该有simplier更有效的方式来做到这一点。

Type type = typeof(FooBar)
BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
type.GetConstructors(flags)
    .Where(constructor => constructor.GetParameters().Length == 0)
    .First();

Answer 1:

type.GetConstructor(Type.EmptyTypes)


Answer 2:

如果你确实需要的ConstructorInfo对象,然后看到科特Hagenlocher的答案 。

在另一方面,如果你真的只是想创建从一个运行时对象System.Type ,看到System.Activator.CreateInstance -它不只是未来需求(活化处理比详情ConstructorInfo.Invoke ) ,这也是丑陋的得多



Answer 3:

如果你有泛型类型参数,然后杰夫·布里奇曼的答案是最好的之一。 如果你只有表示要构造类型的Type对象,你可以使用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表达式可以是昂贵的,但如果你缓存的委托,每次重复使用它,它可以非常快! 我个人使用了一个类型索引静态查找字典。 此功能就派上用场了,当你在处理序列化对象,你可能只知道类型的信息。

注意:如果类型是不施工的,或者没有默认的构造函数就会失败!



Answer 4:

如果你只是想获得默认的构造函数实例化的类,并且所得到的类型作为泛型类型参数的功能,你可以做到以下几点:

T NewItUp<T>() where T : new()
{
   return new T();
}


Answer 5:

你会想尝试FormatterServices.GetUninitializedObject(类型)这个人是不是Activator.CreateInstance更好

然而,这种方法不调用对象的构造函数,所以如果你有初始值设定,这是不行的检查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

但如果对象有构造函数参数多这一个失败

希望这可以帮助



文章来源: Most efficient way to get default constructor of a Type