1

次のロジックでif/thenを使用するより良い代替手段は何ですか:

    public void DoSomething <T>()
    {
        if (typeof (T) == typeof (A))
        {

        }
        else if (typeof (T) == typeof (B))
        {

        }

    }
4

3 に答える 3

3

代わりに、おそらくメソッドをオーバーロードできます。

public void DoSomething(A item)
{
   ...
}

public void DoSomething(B item)
{
   ...
}
于 2013-10-29T15:56:44.693 に答える
3

そうです、それはコードの匂いです。

何かのようなもの:

public void DoSomething <T>() where T : A
{

}

public void DoSomething <T>() where T : B
{

}

ただし、これを行うと、少し臭いがします。より良い解決策は、A と B の両方に共通のインターフェイスを継承させ、メソッドを 1 つにすることwhere T : IMyNewInterfaceです。

それが本当に不可能な場合は、この方法で解決する問題ではないか、アーキテクチャを再検討する必要があるかもしれません。

修正

Eric が以下のコメントで述べているように、上記のコードは有効ではありません。ジェネリックは署名の一部を形成しないため、オーバーロードでは使用できません。

他の唯一のオプションは、通常のオーバーロードです。

public void DoSomething(A a)
{

}

public void DoSomething(B b)    {

}
于 2013-10-29T15:51:24.000 に答える
0

ジェネリックを使用している場合、おそらくオブジェクトを同様の型にするか、同様のメソッド命名を使用する必要があります。

あなたが説明したことで、これは私の好みのパターンです:

public void DoSomethingA() { }
public void DoSomethingB() { }
于 2013-10-29T15:53:00.090 に答える