这是我要写的内容:
public void Foo<T>(T parameter) {
otherObject.Bar<T>(parameter);
}
Bar() 方法的签名是:
public void Bar<T>(T parameter) where T: class
所以我得到一个编译错误,因为 Foo 签名中的 T 没有相同的约束。不幸的是我不会写:
public void Foo<T>(T parameter) where T: class {
otherObject.Bar<T>(parameter);
}
因为 Foo 正在实现一个在外部接口(interface)中定义的方法。问题是:
我可以在调用 Bar 之前以某种方式在方法 Foo 中调换 T 吗? (注意,我可以肯定 T 总是一个类——我只需要通过编译器)。
我发现的唯一方法是使用反射,但我想知道我是否遗漏了一个更简单的技巧。
最佳答案
您可以使用 dynamic
keyword像这样:
public void Foo<T>(T parameter)
{
dynamic p = parameter
otherObject.Bar(p);
}
发生的事情是在运行时解析对 otherObject.Bar
的调用,因为其中一个参数的类型为 dynamic
。假设T
是引用类型,则解析成功。
当然,这最终会使用反射(如您所指出的),但语法可能比您使用的要好。
当然,如果 T
不是类,这会给您一个运行时错误。
关于c# - 如何转换泛型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11436755/