这是我想写的:
public void Foo<T>(T parameter) {
otherObject.Bar<T>(parameter);
}
Run Code Online (Sandbox Code Playgroud)
Bar()方法的签名是:
public void Bar<T>(T parameter) where T: class
Run Code Online (Sandbox Code Playgroud)
所以我得到一个编译错误,因为Foo签名中的T没有相同的约束.不幸的是我不能写:
public void Foo<T>(T parameter) where T: class {
otherObject.Bar<T>(parameter);
}
Run Code Online (Sandbox Code Playgroud)
因为Foo正在实现在外部接口中定义的方法.问题是:
在调用Bar之前,我可以以某种方式在方法Foo中转置T. (注意,我可以肯定T总是会成为一个类 - 我只需要通过编译器).
我发现的唯一方法是使用反射,但我想知道是否有一个更简单的技巧,我错过了.
您可以使用以下dynamic关键字:
public void Foo<T>(T parameter)
{
dynamic p = parameter
otherObject.Bar(p);
}
Run Code Online (Sandbox Code Playgroud)
发生的事情是调用的解析otherObject.Bar是在运行时进行的,因为其中一个参数的类型为dynamic.假设这T是一个引用类型,分辨率将成功.
当然,这最终会使用反射(正如您所指出的那样),但语法可能比您正在使用的更好.
当然,这会给你在该事件运行时错误T是不是一类.
| 归档时间: |
|
| 查看次数: |
229 次 |
| 最近记录: |