如何投射通用参数?

时间:2012-07-11 16:03:53

标签: c#

以下是我要写的内容:

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

我找到的唯一方法就是使用反射,但我想知道是否有一个更简单的技巧我不知道。

4 个答案:

答案 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 {

    }

显示为错误。