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

时间:2009-12-08 19:45:59

标签: 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);
}

但是,新<dataType>中的DoSomething会引发以下类型检查错误:“预期输入名称或命名空间。”

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

4 个答案:

答案 0 :(得分:15)

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

有两种解决方法:

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

  • 使用反射从非通用代码中调用通用代码。这很繁琐,也不会表现得那么好,但你可以弃用非通用代码并最终删除它。

或者您现在可以将其删除,然后解决所有问题:)

答案 1 :(得分:7)

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

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

private void DoSomething(Data data, Type dataType)
{
    ...
}

答案 2 :(得分:6)

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

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

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

static void DoSomething(Data data, Type dataType) {
  ...
}

答案 3 :(得分:1)

如果这是一种私有方法,那么外部向后兼容性又有什么问题呢?