5

たとえば、実行時にテンプレートクラスをインスタンス化することは可能ですか?

Type type = Type.GetType("iTry.Workflow.Person");
WorkflowPropertyViewModel<type> propViewModel = new WorkflowPropertyViewModel<type>();

これは明らかに機能しません。それを行う他の方法はありますか?

Genericクラスは次のようになります。

public class WorkflowPropertyViewModel<T> : IProperty<T>  
{
    public Task<T> ValueAsync
    {
        get;
        set;
    }

    public T Value
    {
        get;
        set;
    }

    public IQueryable<T> PossibleItems
    {
        get;
        set;
    }
}
4

3 に答える 3

6

Type オブジェクトを指定すると、任意の型のオブジェクトを作成できます。

object o = Activator.CreateInstance(type);

これは、型にデフォルトのコンストラクターがあることを前提としています。コンストラクターのパラメーターを渡すための他の Activator メソッドがあります。

http://msdn.microsoft.com/en-us/library/wccyzw83.aspx

特定のジェネリック型を取得するには、ジェネリック型定義で MakeGenericType を呼び出すことができます

http://msdn.microsoft.com/en-us/library/system.type.makegenerictype.aspx

まとめると以下のようになります。

var type = Type.GetType("iTry.Workflow.Person");
var genericType = typeof(WorkflowPropertyViewModel<>).MakeGenericType(type);
var o = Activator.CreateInstance(genericType);
于 2012-11-22T12:39:30.930 に答える
2

これを試して:

object o = Activator.CreateInstance(typeof(WorkflowPropertyViewModel<>).MakeGenericType(new Type[] {type}));

コードでは、別の非ジェネリックインターフェイスを実装しない限り、その型を簡単に参照できないことに注意してください。そのため、代わりにオブジェクトを使用するか、より多くのリフレクションを使用する必要があります。

于 2012-11-22T12:42:50.237 に答える
2

はい、実行時にのみ知られている型でジェネリック クラスをインスタンス化できます。

public class A { }
public class U<T> {
    public T X { get; set; }
}

static void Main(string[] args) {
    Type a = typeof(A);
    Type u = typeof(U<>);
    dynamic uOfA = Activator.CreateInstance(u.MakeGenericType(a));
    uOfA.X = new A();
    Console.WriteLine(uOfA.GetType());
    Console.WriteLine(uOfA.X.GetType());
}

ただし、このスニペットはリフレクションと動的型付けを使用しており、どちらも多くのメンテナンス上の問題を引き起こす可能性があるため、慎重に使用するか、より簡単な解決策を見つけることをお勧めします。

于 2012-11-22T12:45:13.200 に答える