14

ジェネリックの新しいインスタンスを作成したい場合は、次のように新しい制約を定義する必要があります。

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

リフレクションを使用して、次のように新しい制約なしで T のインスタンスを作成することは可能ですか (疑似コードを含む):

public T SomeMethod<T>()
{
    if (T has a default constructor)
    {
        return a new instance of T;
    }
    else
    {
        return Factory<T>.CreateNew();
    }
}
4

3 に答える 3

21

これに使用Activator.CreateInstance()します。この方法の使用方法の詳細については、 http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspxを参照してください。基本的に、あなたがすることは次のとおりです。

var obj = (T)Activator.CreateInstance(typeof(T));

GetConstructors()メソッドを使用して、デフォルトのコンストラクターがあるかどうかを確認できます。

var constructors = typeof(T).GetConstructors();

パラメータがゼロのコンストラクタが見つかった場合は、メソッドを使用できますActivator.CreateInstance。それ以外の場合は、Factory<T>.CreateNew()メソッドを使用します。

編集:

パラメーターのないコンストラクターが存在するかどうかを直接確認するには、次のチェックを使用できます。

if (typeof(T).GetConstructor(Type.EmptyTypes) != null)
{
    // ...
于 2013-06-26T06:47:08.307 に答える