如何重构方法接受泛型类型作为C#中的参数?

时间:2014-03-28 01:08:55

标签: c# generics refactoring

我有一堆创建相同结果类型的方法,但它们的参数类型各不相同。假设int是结果类型,boolintfloat等,等, 和原型是这样的:

int method1(int param1);
int method2(bool param1);
int method3(float param1);

如何重构它们看起来像这样:

int methodGenericVersion1<T>(T arg1);

顺便说一下,我看不到那些非泛型方法的实现。

修改

我想这样调用:

methodGenericVersion1<int>(param1);
methodGenericVersion1<bool>(param1);
methodGenericVersion1<float>(param1);

3 个答案:

答案 0 :(得分:3)

听起来你想根据实际的泛型类型调度到'正确'的方法,如下所示:

public int GenericMethod<T>(T t)
{
    if (t is int)
    {
        return method1(t as int);
    }
    else if (t is bool)
    {
        return method2(t as bool);
    }
    else if (t is float)
    {
        return method3(t as float);
    }
    ...

    throw new ArgumentInvalidException(...);
}

但是,如果目标是提供可以在有限范围内以多态方式使用的“单一方法”,那么我会质疑为什么通用是必要的。您可以使用方法重载并获得完全相同的开发人员体验,如下所示:

public int method(int arg)
{
     return method1(arg);
}

public int method(bool arg)
{
     return method2(arg);
}

public int method(float arg)
{
      return method3(arg);
}

答案 1 :(得分:1)

你是如此接近。你需要在方法名称中指定泛型参数,如下所示:

int methodGenericVersion1<T>(T arg1)

如果您只想传递值类型,也可以添加struct约束:

int methodGenericVersion1<T>(T arg1) where T : struct

答案 2 :(得分:0)

您可以这样做:

int Test<T>(T v)
{
    return -1;
}