7

这是我要写的内容:

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

4 回答 4

9

您可以像这样使用dynamic关键字

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

    otherObject.Bar(p);
}

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

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

当然,如果不是T类,这会给你一个运行时错误。

于 2012-07-11T16:10:04.703 回答
4
public void Foo<T>(T parameter)
{
    otherObject.Bar<object>(parameter);
}
于 2012-07-11T16:11:49.123 回答
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接口。

于 2012-07-11T16:16:17.757 回答
0

如果你是 otherObject.Bar 的所有者,你能不只是删除类约束吗?那个方法。或者创建一个没有约束的新的类似方法?

卡斯珀一。我不确定您的答案是否正确,因为您的 Foo 方法有类约束。该问题表明这是不可能的,因为 Foo 是外部接口的实现。例如,下面的代码不起作用。

public void Foo<T>(T param)
    {
        dynamic xx = param;

        this.Bar(param);
    }

    private void Bar<T>(T param) where T: class {

    }

并显示为错误。

于 2012-07-11T16:12:48.357 回答