ジェネリック型パラメーターがある場合は、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 式を常に再コンパイルするとコストがかかる可能性があるため、このデリゲートをキャッシュする必要がありますが、デリゲートをキャッシュして毎回再利用すると、非常に高速になります。私は個人的に、タイプ別に索引付けされた静的ルックアップ辞書を使用しています。この関数は、Type 情報しか知らないシリアライズされたオブジェクトを扱う場合に便利です。
注: 型が構築可能でない場合、または既定のコンストラクターがない場合、これは失敗する可能性があります。