ねえ、私は抽象的なジェネリック型を持っていBList<TElement> where TElement : Career
ます。キャリアも抽象型です。
タイプTが与えられた場合、それがBListタイプであるかどうかをテストするにはどうすればよいですか?そして、どうすれば基本クラスにキャストできますか?試し(BList<Career>)object
ましたが、コンパイラが動揺しました。BList<Career>
どうやらキャリアが抽象的なので書けないようです。
あなたの質問には少し曖昧さがありますので、私はあなたが尋ねているかもしれないと思うことのいくつかに答えようとします...
T
インスタンスがBListであるかどうかを確認したい場合は、次を使用できis
ます。
if (someInstance is BList<Career>)
{
...
}
ジェネリック型パラメーターがであるかどうかを確認したい場合は、BList<Career>
次を使用できますtypeof
。
if (typeof(T) == typeof(BList<Career>)
{
...
}
ただし、それが存在するかどうかを確認したいだけの場合は、 BList<>
リフレクションを使用できます。
var t = typeof(T); // or someInstance.GetType() if you have an instance
if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(BList<>))
{
...
}
さて、どのようにaBList<TElement>
をにキャストしますBList<Career>
か?あなたは安全にできません。
Career
これは抽象的であることとは何の関係もありません、それはから継承しているのにから継承BList<Career>
しないという事実と関係があります。BList<TElement>
Career
TElement
このことを考慮:
public class Animal { }
public class Dog : Animal { }
public class Cat : Animal { }
それらを考慮して、なぜこれが機能しないのかを自分自身に尋ねてください:
List<Animal> animals = new List<Cat>();
問題がわかりますか?をにキャストできるようにするList<Cat>
とList<Animal>
、突然、メソッドがの代わりにAdd()
サポートするようになります。つまり、これを行うことができます。Animal
Cat
animals.Add(new Dog());
Dog
明らかに、にを追加できるはずの方法はありませんList<Cat>
。これが、から継承しているにもかかわらず、List<Cat>
をとして使用できない理由です。List<Animal>
Cat
Animal
ここでも同様のケースです。
var item = theObject as BList<Career>;
もしそうならnull
、それはそのタイプではありません。