什么是最有效的方式来获得的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();
type.GetConstructor(Type.EmptyTypes)
如果你确实需要的ConstructorInfo对象,然后看到科特Hagenlocher的答案 。
在另一方面,如果你真的只是想创建从一个运行时对象System.Type
,看到System.Activator.CreateInstance
-它不只是未来需求(活化处理比详情ConstructorInfo.Invoke
) ,这也是丑陋的要少得多 。
如果你有泛型类型参数,然后杰夫·布里奇曼的答案是最好的之一。 如果你只有表示要构造类型的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表达式可以是昂贵的,但如果你缓存的委托,每次重复使用它,它可以非常快! 我个人使用了一个类型索引静态查找字典。 此功能就派上用场了,当你在处理序列化对象,你可能只知道类型的信息。
注意:如果类型是不施工的,或者没有默认的构造函数就会失败!
如果你只是想获得默认的构造函数实例化的类,并且所得到的类型作为泛型类型参数的功能,你可以做到以下几点:
T NewItUp<T>() where T : new()
{
return new T();
}
你会想尝试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
但如果对象有构造函数参数多这一个失败
希望这可以帮助