基于泛型类型参数和C#的条件代码

时间:2016-01-25 22:25:18

标签: c# asp.net-mvc types

我在C#中有一个方法,它接收泛型类型作为参数:

private void DoSomething<T>(T param)
{
    //...
}

我需要执行不同的操作,具体取决于param的类型。我知道我可以使用几个if个句子实现它,如下所示:

private void DoSomething<T>(T param)
{
    if (param is TypeA)
    {
        // do something specific to TypeA case

    } else if (param is TypeB)
    {
        // do something specific to TypeB case

    } else if ( ... )
    {
        ...
    }

    // ... more code to run no matter the type of param
}

有更好的方法吗?也许使用switch-case或其他我不知道的方法?

4 个答案:

答案 0 :(得分:5)

只使用重载而不是泛​​型。

答案 1 :(得分:3)

如果项目/逻辑结构允许将DoSomething移动到T并用IDoSomething接口描述它会很好。这样你就可以写:

private void DoSomething<T>(T param) where T:IDoSomething
{
    param.DoSomething()
}

如果那不是一个选项,那么你可以设置规则字典

var actionsByType = new Dictionary<Type, Action<T /*if you neeed that param*/>(){
   { Type1, DoSomething1 },
   { Type2, DoSomething2 },
   /..
}

在您的方法中,您可以致电:

private void DoSomething<T>(T param){
  //some checks if needed
  actionsByType[typeof(T)](param/*if param needed*/);
}

答案 2 :(得分:2)

您可以为特定类型创建特定方法。

{{1}}

答案 3 :(得分:1)

如前所述,如果它的简单案例使用重载。任何陌生的东西你都可以适应这种情况(它的快速和肮脏的道歉)。

class Program
{

    interface IDoSomething<T>
    {
        void DoSomething(T param);
    }

    class Test : IDoSomething<int>, IDoSomething<string>
    {
        public void DoSomething(int param)
        {

        }

        public void DoSomething(string param)
        {

        }
    }

    static void Main(string[] args)
    {

        DoSomething(4);

    }

    static void DoSomething<T>(T param)
    {
        var test = new Test();
        var cast = test as IDoSomething<T>;
        if (cast == null) throw new Exception("Unhandled type");
        cast.DoSomething(param);
    }
}