1
我在构造函数中将对象的Type
作为参数传递,但我想将此类型限制为仅从特定接口继承的对象。传递类型作为参数,但限制为接口
public MyClass(Type myType);
我知道我可以检查该类型从接口继承的方法的身体像这样:
if(typeof(IMyInterface).IsAssignableFrom(myType))
但是是可能的参数类型约束?
我在构造函数中将对象的Type
作为参数传递,但我想将此类型限制为仅从特定接口继承的对象。传递类型作为参数,但限制为接口
public MyClass(Type myType);
我知道我可以检查该类型从接口继承的方法的身体像这样:
if(typeof(IMyInterface).IsAssignableFrom(myType))
但是是可能的参数类型约束?
为什么不让你的类变得通用?在这种情况下,你可以指定你的约束,而不用担心检查参数。
E.g.
public class MyClass<T>
where T : IMyInterface
{
....
}
因为你表明,检查在运行时类型代码,我认为要强制在编译时的类型约束:
public class MyClass<T> where T : IMyInterface {
public MyClass(T myArg) {
Type myType = typeof(T);
Type argType = myArg.GetType();
Debug.Assert(myType == argType, "types must be the same!");
}
}
你不能做到这一点在构造函数中,但你可以在类声明中做到这一点。
在C#世界中没有任何东西可以让你进一步限制一个参数,而不仅仅是它的类型和继承。当你编写一个采用int的方法时,也不可能将该方法限制为只接受[0,10]范围内的数字(通过一种很好的语法)。你想要的是使用PostSharp,CodeContracts或类似的东西,当某些条件不满足时抛出异常,例如,当给定的Type对象没有实现某个接口时。您可以自己编写此代码,只需在此情况下引发ArgumentException。 – Simon