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)
这里的问题是您正在混合泛型参数和运行时类型信息.用于泛型参数的类型值必须在编译时建立并嵌入元数据中.该类型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)
| 归档时间: |
|
| 查看次数: |
1010 次 |
| 最近记录: |