在以下逻辑中使用 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 <T>() where T : A
{
}
public void DoSomething <T>() where T : B
{
}
如果你这样做,那么它仍然会感觉有点臭。更好的解决方案是让 A 和 B 都继承一个公共接口,然后使用一个方法where T : IMyNewInterface
。
如果这真的不可能,那么以这种方式解决这可能不是问题,或者架构可能需要重新审视。
更正
正如 Eric 在下面的评论中所述,上述代码无效。泛型不构成签名的一部分,因此不能用于重载。
唯一的其他选择是正常重载:
public void DoSomething(A a)
{
}
public void DoSomething(B b) {
}
您可能会重载该方法:
public void DoSomething(A item)
{
...
}
public void DoSomething(B item)
{
...
}
当您使用泛型时,您可能希望您的对象具有相似的类型或具有相似的方法命名。
根据您的描述,这是我的首选模式:
public void DoSomethingA() { }
public void DoSomethingB() { }