4

ねえ、私は抽象的なジェネリック型を持っていBList<TElement> where TElement : Careerます。キャリアも抽象型です。

タイプTが与えられた場合、それがBListタイプであるかどうかをテストするにはどうすればよいですか?そして、どうすれば基本クラスにキャストできますか?試し(BList<Career>)objectましたが、コンパイラが動揺しました。BList<Career>どうやらキャリアが抽象的なので書けないようです。

4

2 に答える 2

8

あなたの質問には少し曖昧さがありますので、私はあなたが尋ねているかもしれないと思うことのいくつかに答えようとします...

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

ここでも同様のケースです。

于 2012-09-26T15:59:27.973 に答える
1
var item = theObject as BList<Career>;  

もしそうならnull、それはそのタイプではありません。

于 2012-09-26T15:55:10.560 に答える