如何在c#中重构方法以接受泛型类型作为参数

本文关键字:泛型类型 参数 方法 重构 | 更新日期: 2023-09-27 17:54:46

我有一堆方法创建相同的结果类型,但它们的参数类型不同。假设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);

如何在c#中重构方法以接受泛型类型作为参数

听起来你想要分派到基于实际泛型类型的"正确"方法,像这样:

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);
}

你很接近了。你只需要在方法名中指定像这样的泛型参数:

int methodGenericVersion1<T>(T arg1)

如果你只想传递值类型,你也可能想添加一个struct约束:

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

你可以这样做:

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