如何投射通用参数?

Ric*_*son 7 c#

这是我想写的:

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总是会成为一个类 - 我只需要通过编译器).

我发现的唯一方法是使用反射,但我想知道是否有一个更简单的技巧,我错过了.

cas*_*One 9

您可以使用以下dynamic关键字:

public void Foo<T>(T parameter)
{
    dynamic p = parameter

    otherObject.Bar(p);
}
Run Code Online (Sandbox Code Playgroud)

发生的事情是调用的解析otherObject.Bar是在运行时进行的,因为其中一个参数的类型为dynamic.假设这T是一个引用类型,分辨率将成功.

当然,这最终会使用反射(正如您所指出的那样),但语法可能比您正在使用的更好.

当然,这会给你在该事件运行时错误T不是一类.