以下是我要写的内容:
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正在实现在外部接口中定义的方法。问题是:
我可以在调用Bar之前以某种方式在方法Foo中转置T。 (注意,我可以肯定T总是会成为一个类 - 我只需要通过编译器。)
我找到的唯一方法就是使用反射,但我想知道是否有一个更简单的技巧我不知道。
答案 0 :(得分:9)
您可以像这样使用dynamic
keyword:
public void Foo<T>(T parameter)
{
dynamic p = parameter
otherObject.Bar(p);
}
正在发生的事情是,otherObject.Bar
调用的解析是在运行时进行的,因为其中一个参数的类型为dynamic
。假设T
是引用类型,则解析将成功。
当然,这最终会使用反射(正如您所指出的那样),但语法可能比您正在使用的更好。
当然,如果T
不是一个类,这会给你一个运行时错误。
答案 1 :(得分:4)
public void Foo<T>(T parameter)
{
otherObject.Bar<object>(parameter);
}
答案 2 :(得分:3)
这是对casperOne的回答略有不同,使用隐式接口实现:
public void Foo<T>(T parameter) where T: class {
otherObject.Bar<T>(parameter);
}
void IFoo.Foo<T>(T parameter){
Foo((dynamic)parameter);
}
这允许您在编译时将任何知道他们正在调用的特定对象类型.Foo
的内容包含在约束中,同时仍允许您实现IFoo
接口。
答案 3 :(得分:0)
如果您是otherObject.Bar的所有者,您是否可以删除类约束?那种方法。或者创建一个没有约束的新类似方法?
casperOne。我不确定你的答案是否正确,因为你的Foo方法有类约束。问题表明这是不可能的,因为Foo是外部接口的实现。例如,下面的代码不起作用。
public void Foo<T>(T param)
{
dynamic xx = param;
this.Bar(param);
}
private void Bar<T>(T param) where T: class {
}
显示为错误。