2
class A { }
interface I { }
void GenericStuff<T>(T x) { }
void SpecificStuff<T>(T x) where T : A, I { }

void Start<T>(T x)
{
    if (x is A && x is I)
        SpecificStuff(x); // <---- Wrong type
    else
        GenericStuff(x);
}

我有上面说明的情况。在方法中Start(),我得到一个参数x,根据它的类型,我想调用GenericStuff()SpecificStuff()方法。自然,类型约束阻止了我这样做,并且由于它们有两个,我无法通过强制转换来绕过它们。

有没有办法(缺乏反思)来实现这一点?

4

1 回答 1

5

您可以使用dynamic. 虽然这或多或少是美化的反射,但它看起来要好得多:

void Start<T>(T x)
{
    if (x is A && x is I)
        SpecificStuff((dynamic)x);
    else
        GenericStuff(x);
}

请注意:
如果稍后您将类型约束更改SpecificStuff为包含第三个接口并且您忘记相应地更新您的接口if,您将得到运行时异常而不是编译时错误。

于 2013-04-04T10:16:50.210 回答