如果您具有泛型类型参数,那么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);
var lambda = Expression.Lambda<Func<object>>(newExp);
return lambda.Compile();
}
}
只需致电返回给您的代表即可。您应该缓存此委托,因为不断重新编译Linq表达式可能会很昂贵,但是如果您缓存该委托并每次重用它,则它可能会非常快!我个人使用按类型索引的静态查找字典。当您处理序列化的对象时,该功能可能会派上用场,在这些对象中您可能只知道Type信息。
注意:如果类型不可构造或没有默认构造函数,则可能会失败!