当参数没有这些约束时,如何使用类型约束调用泛型方法?

时间:2013-04-04 10:12:56

标签: .net generics type-constraints

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()方法。当然,类型约束阻止我这样做,并且由于它们中有两个,我无法通过强制转换它们。

有没有办法(没有反思)来实现这个目标?

1 个答案:

答案 0 :(得分:5)

您可以使用dynamic。虽然这或多或少是美化的反映,但看起来更好:

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

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