替代if / then使用泛型时

时间:2013-10-29 15:47:47

标签: c# design-patterns

在以下逻辑中使用if / then的更好选择是什么:

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

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

        }

    }

3 个答案:

答案 0 :(得分:3)

你是对的,这是一种代码味道。

类似:

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

}

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

}

如果你这样做,那么它会感觉有点臭。一个更好的解决方案是同时拥有A&amp; B继承了一个通用接口,然后只有一个方法where T : IMyNewInterface

如果真的不可能,那么这可能不是解决这个问题的方法,或者架构可能需要重新访问。

<强> CORRECTION

以上代码无效,正如Eric在下面的评论中所述。泛型不构成签名的一部分,因此不能用于过载。

唯一的另一种选择是正常过载:

public void DoSomething(A a)
{

}

public void DoSomething(B b)    {

}

答案 1 :(得分:3)

您可能会重载该方法:

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

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

答案 2 :(得分:0)

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

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

public void DoSomethingA() { }
public void DoSomethingB() { }