0

次のコードが与えられた場合、一般的に型指定されたアイテムのコレクションを持つことは可能ですか:

public abstract class AGeneric<T> {
internal virtual List<T>  MyList { get; set; } 
}


public class LibA<T> : AGeneric<T> {
internal override List<T>  MyList { get; set; } 
}

public class LibB<T> : AGeneric<T> {
internal override List<T>  MyList { get; set; } 
}

public class LibC<T> : AGeneric<T> {
internal override List<T>  MyList { get; set; } 
}
//.
//.
//.
Main {
    List<AGeneric>  test  = new List<AGeneric>(); //error - requires type; 
    List<BGeneric>  test2 = new List<BGeneric>();
    test2.first().


}

public abstract class BGeneric {
internal virtual List<T>  MyList { get; set; } //cant use T to provide implementation       
}


public class LibD<T> : BGeneric {
internal override List<T>  MyList { get; set; } 
}

public class LibE<T> : BGeneric {
internal override List<T>  MyList { get; set; } 
}

public class LibF<T> :BGeneric {
internal override List<T>  MyList { get; set; } 
}

クラスの目的は を決定し、厳密に型指定されたオブジェクトの配列を返すことであるため、抽象クラスからさまざまな型の List を実装することが目標です。

4

1 に答える 1

0

いいえ、ただし、ランタイム タイプの非ジェネリックのリストを作成できます。この例は基本的にあなたが求めているものですが、AGeneric にはジェネリック パラメータが必要なため、実行時エラーが発生します (例 1 のみ) 。ジェネリックではないものを再構築できる場合は、この作業を適応させることができます。

Type listType = typeof(List<>).MakeGenericType(typeof(AGeneric<>));
var answer = Activator.CreateInstance(listType);

同様に、AGeneric が必要な場合は、ランタイム タイプでリストを作成できます。

int myRunTimeVariable = 0;
Type MyType = myRunTimeVariable.GetType();

Type listType = typeof(List<>).MakeGenericType(typeof(AGeneric<>).MakeGenericType(MyType));
var answer = Activator.CreateInstance(listType);

answerList<AGeneric<int>>この場合は型になります。しかし、それはまだではありませんList<AGeneric<>>

于 2013-03-15T21:17:19.880 に答える