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 <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)    {

}
于 2013-10-29T15:51:24.000 回答
3

您可能会重载该方法:

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

public void DoSomething(B item)
{
   ...
}
于 2013-10-29T15:56:44.693 回答
0

当您使用泛型时,您可能希望您的对象具有相似的类型或具有相似的方法命名。

根据您的描述,这是我的首选模式:

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