-4

キャストにジェネリック型を使用したいのですが、これを行う簡単な方法はありますか? 次に例を示します。

var resource = viewBase.getAnyInstance(resourceName) as T;

ここで、T は既存の型の 1 つです。

任意の提案をいただければ幸いです。

4

1 に答える 1

1

Aは、何を操作しているかについて明確で簡潔な知識がなくても、Generic複数のタイプの を処理するための優れた方法です。とObjectsを使用するときに発生する可能性のあるいくつかの問題を軽減できるため、それ自体でかなりの柔軟性が生まれます。BoxingUnboxing

わかりやすくするGenericsために、例を使用しますList。ほとんどの場合、少なくとも私にとっては、本当に固まっCastingたからGenericsです。

Cast問題は、その間にしようとした場合、List Genericsすぐにわかります...できません。

この例では Shapes を使用するので、理論上は 3 つのクラスがあります。

クラス:

  • サークル
  • 四角
  • ポリゴン

あなたが学んだとき、Castingこれは非常に簡単です。

int i = 10;
string j = "I have ";
string d = j + (string)i;

そして、あなたはあなたをに変換variable iしましたString。タイプが適合する限り。大丈夫です。そうでない場合は、例外が発生します。

導入Genericsするとすぐに変わります。

さて、上で見たように、Classesを表す3 つがありShapesます。これで、 aは技術的にはそれらによって継承されるはずShapeの commonになります。したがって、から継承することはできません。それは定量的であり、もっともらしいようです。しかし、そうではありません、なぜですか?ObjectShapesList<Square>List<Circle>

これConstructed Typeは、データの変換が行われる によるものです。

したがって、場合によっては、あるデータから別のデータに転送Listするために a を記述する必要があります。LoopList

したがって、これはGenerics非常に役立つ場所です。

// Square List:
List<Square> lSq = new List<Square>();

   lSq.Add(new Square("Red Square"));
   lSq.Add(new Square("Blue Square"));

Square Listオブジェクトを保持する を作成しました。

// Generic Shape
List<Shape> shp = lSq.ConvertAll(
   new Converter<Square, Shape>(lSqToshp));

実際には、これらの値に aGenericCast直接 newに使用しましたList

さて、それはあなたの質問ではないことを理解しています。あなたの質問:

キャストにジェネリック型を使用したいのですが、これを行う簡単な方法はありますか?

簡単に言えば、はい。ただし、バリエーションは目的と使用法によって異なります。あなたはそれがAbstract Class.

さて、あなたは次のようなことをしようとしています:

public void SomeMethod(object caller)
{
   someClass<T> info = caller as someClass<T>;
   if (info != null)
   {}
}

それCastingAbstract Class.

var detail = (SomeClassBase)viewBase.getAnyInstance(detailName); 

たくさんのバリエーションがあります。

あなたの漠然とした質問に似た投稿がここにあります。詳細については、別の投稿をご覧ください。すでに知られている を渡そうとするObject場合、呼び出し元を直接使用しないのはなぜですか?

残念ながら、あなたの質問には、より良い回答を得るために、より詳細な情報が必要になります。しかし、理解に苦しむようですねGenerics

于 2013-02-07T23:08:18.800 に答える