如果您有泛型类型参数,那么 Jeff Bridgman 的答案是最好的。如果你只有一个代表你想要构造的类型的 Type 对象,你可以Activator.CreateInstance(Type)
像 Alex Lyman 建议的那样使用,但有人告诉我它很慢(虽然我没有亲自分析它)。
但是,如果您发现自己非常频繁地构造这些对象,则使用动态编译的 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 表达式可能会很昂贵,但是如果你缓存委托并每次都重用它,它会非常快!我个人使用按类型索引的静态查找字典。当您处理可能只知道类型信息的序列化对象时,此函数会派上用场。
注意:如果类型不可构造或没有默认构造函数,这可能会失败!