是否使用泛型类型参数重载?

Mik*_*las 3 c# generics parameters overloading

我想添加泛型类型方法DoSomething<T>,但为了向后兼容,我希望它只是从具有相同名称的现有方法传递泛型类型的type参数.

public void DoSomething<T>(Data data)
{
    //do something with Data, it depends on the type of T
}

public void DoSomething(Data data, Type dataType)
{
    DoSomething<dataType>(group);
}
Run Code Online (Sandbox Code Playgroud)

但是,<dataType>DoSomething类型检查错误的新抛出中:"预期类型名称或命名空间".

有人可以帮助我理解我的想法中的差距,使上述样本成为类型检查错误吗?我正在做的只是......糟糕的设计?

Jon*_*eet 15

泛型是关于在编译时知道类型 - 你只知道执行时的类型.

有两种方法可以解决这个问题:

  • 使通用代码调用非通用代码.这很容易,但你不会有泛型的任何好处.

  • 使用反射从非泛型代码中调用通用代码.这是繁琐的,也不会表现得那么好,但你可以弃用非通用代码并最终将其删除.

或者你现在可以删除它,并修复一切:)


小智 7

我通常发现更容易扭转方法之间的关系,即:

private void DoSomething<T>(Data data)
{
    DoSomething(data, typeof(T));
}

private void DoSomething(Data data, Type dataType)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)


Jar*_*Par 6

这里的问题是您正在混合泛型参数和运行时类型信息.用于泛型参数的类型值必须在编译时建立并嵌入元数据中.该类型Type是一个构造,其值在编译时是未知的.因此2不兼容.

这里最好的选择是将原始的DoSomething方法作为主要方法,并将新的通用方法输入其中.

static void DoSomething<T>(Data data) {
  DoSomething(data, typeof(T));
}

static void DoSomething(Data data, Type dataType) {
  ...
}
Run Code Online (Sandbox Code Playgroud)