0

Media と Container の 2 つのクラスがあります。

私は2つのリストを持っていてList<Media>List<Container>

これらのリストを別の関数に (一度に 1 つずつ) 渡しています。

それはどちらでもかまいません。

リストの「テンプレート」タイプをチェックして、リストのタイプに応じて関連付けられたメソッドを呼び出すことができる適切な方法は何ですか?

または、 List<> にキャストして、その周りに Try/Catch ブロックを配置する必要がありますか?

    Object tagObj = mediaFlow1.BackButton.Tag;

    if (tagObj == Media)
       //do this
    else if (tagObj == Container)
        //do this
    else
        throw new Exception("Not a recognized type");
4

4 に答える 4

11

適切なことは、この関数に 2 つのオーバーロードを用意し、それぞれの型を受け入れることです。

public void MyMethod(List<Media> source)
{
  //do stuff with a Media List
}

public void MyMethod(List<Container> source)
{
  //do stuff with a Container List
}
于 2008-12-10T20:03:35.967 に答える
3

Type 型の GetGenericArguments メソッドを次のように使用できます。

オブジェクト[] テンプレート = myObject.GetType().GetGenericArguments();

于 2008-12-10T20:08:08.547 に答える
2

ダビデが言ったこと。

しかし、これが同じ機能を通過しなければならない場合は、typeofオペレーターが助けてくれるはずです。また、これはアーキテクチャ上の欠陥があるように聞こえます。Media クラスは Container クラスとどのように関連していますか? 実装する必要がある両方で使用される共通のインターフェースはありますか?

于 2008-12-10T20:05:42.280 に答える
0

まあ、それはあなたの「//これを行う」メソッドが何であるかに依存します...それがメディアまたはコンテナオブジェクトで動作するメソッドであり、それが何であるかに基づいて異なることを行う場合、そのメソッドを配置する必要がありますそれらのクラス...

ICanDoThis という名前のインターフェイスを宣言する

public interface ICanDoThis { void DoThis(); }

Media と Container の両方がそのインターフェースを実装していることを確認してください

public class Media: ICanDoThis { // }
public class Container: ICanDoThis { // }

そして、クライアントコードの「その他の関数」で次のことができます

 public void OtherFunction(List<ICanDoThis> list)
 {
    foreach(ICanDoThis obj in list)
        obj.DoThis();
 }

それだけです...このコードは、実際のオブジェクトの具象型が何であるかに応じて、メディアクラスまたはコンテナクラスのいずれかで適切な実装を呼び出します。それらを区別するコードを記述する必要はありません...

于 2008-12-10T20:22:24.743 に答える