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()
方法。当然,类型约束阻止我这样做,并且由于有两个约束,我无法通过强制转换来绕过它们。
有什么方法(无需反射(reflection))可以实现这一点吗?
最佳答案
您可以使用动态
。虽然这或多或少是美化的反射,但它看起来更好:
void Start<T>(T x)
{
if (x is A && x is I)
SpecificStuff((dynamic)x);
else
GenericStuff(x);
}
请注意:
如果稍后您更改 SpecificStuff
的类型约束以包含第三个接口(interface),并且您忘记相应地更新您的 if
,您将收到运行时异常并且无法编译时间错误。
关于.net - 当参数没有这些约束时,如何调用具有类型约束的泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15808370/