次のロジックでif/thenを使用するより良い代替手段は何ですか:
public void DoSomething <T>()
{
if (typeof (T) == typeof (A))
{
}
else if (typeof (T) == typeof (B))
{
}
}
次のロジックでif/thenを使用するより良い代替手段は何ですか:
public void DoSomething <T>()
{
if (typeof (T) == typeof (A))
{
}
else if (typeof (T) == typeof (B))
{
}
}
代わりに、おそらくメソッドをオーバーロードできます。
public void DoSomething(A item)
{
...
}
public void DoSomething(B item)
{
...
}
そうです、それはコードの匂いです。
何かのようなもの:
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) {
}
ジェネリックを使用している場合、おそらくオブジェクトを同様の型にするか、同様のメソッド命名を使用する必要があります。
あなたが説明したことで、これは私の好みのパターンです:
public void DoSomethingA() { }
public void DoSomethingB() { }