【问题标题】:How to refactor method to accept generic type as its argument in C#?如何重构方法以接受泛型类型作为 C# 中的参数?
【发布时间】:2014-03-28 13:57:42
【问题描述】:

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

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

【问题讨论】:

  • 如果您看不到(并且可能会更改)该方法的代码,那么您对制作通用的东西有什么期望?显示您拥有的示例代码以及您想要实现的大致目标......
  • 这只有在所有三种方法都具有相同代码的情况下才有用。使用具有不同参数的单独方法的正常原因是您可以为不同的输入设置不同的逻辑。
  • @AlexeiLevenkov 像下面的答案一样用一种方法分派他们。

标签: c# generics refactoring


【解决方案1】:

听起来您想根据实际的泛型类型分派到“正确”方法,如下所示:

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

【讨论】:

  • 我好像违反了generic的使用规则。
  • 你的第一个解决方案是我想要的,我想要那个版本的原因是我遇到了一个不断改变参数类型的情况,但是参数分散在周围,其他未知的方法可能取决于那种类型的论点。
  • 我的第一个解决方案应该是一个反例。原因是当你编写一个泛型方法时,它应该适用于任何满足泛型类型参数上的泛型参数约束的类型。否则,泛型方法会产生误导:它的类型签名说它可以接受一个类型,但它不遵循这个承诺。
  • 问题已经变成另一个与dynamic有关的问题。
【解决方案2】:

你是如此接近。只需在方法名称中指定通用参数,如下所示:

int methodGenericVersion1<T>(T arg1)

如果您只想传递值类型,您可能还需要添加 struct 约束:

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

【讨论】:

    【解决方案3】:

    你可以这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多