ねえ、私は抽象的なジェネリック型を持ってい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>CareerTElement
このことを考慮:
public class Animal { }
public class Dog : Animal { }
public class Cat : Animal { }
それらを考慮して、なぜこれが機能しないのかを自分自身に尋ねてください:
List<Animal> animals = new List<Cat>();
問題がわかりますか?をにキャストできるようにするList<Cat>とList<Animal>、突然、メソッドがの代わりにAdd()サポートするようになります。つまり、これを行うことができます。AnimalCat
animals.Add(new Dog());
Dog明らかに、にを追加できるはずの方法はありませんList<Cat>。これが、から継承しているにもかかわらず、List<Cat>をとして使用できない理由です。List<Animal>CatAnimal
ここでも同様のケースです。
var item = theObject as BList<Career>;
もしそうならnull、それはそのタイプではありません。