我想添加泛型类型方法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
会引发以下类型检查错误:“预期输入名称或命名空间。”
有人可以帮助我理解我的想法中的差距,使上述样本出现类型检查错误吗?我正在做的只是......糟糕的设计?
答案 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)
如果这是一种私有方法,那么外部向后兼容性又有什么问题呢?