以下是这种情况。我有一个类和一个派生类
public class MyClass
{ }
public class MyDerivedClass : MyClass
{ }
我还有一个方法(在外部类中),它以MyClass
的实例作为参数:
public class AnotherClass {
public void DoSomething(MyClass myClass)
{ }
}
如何限制DoSomething
方法仅接受MyClass
的实例,而不接受MyDerivedClass
的实例?
答案 0 :(得分:1)
如果这就是您想要的,那么您需要自己检查代码,如果是派生类型,请通过例外告诉调用代码派生此方法不允许使用类型对象:
public class AnotherClass {
public void DoSomething(MyClass myClass)
{
if(myClass.GetType() != typeof(MyClass))
{
throw new Exception("Derived objects not allowed");
}
}
}
答案 1 :(得分:1)
你在这里想做什么更多地与在所有编程语言中非常常见的Invariance问题有关。
表示您只能使用最初指定的类型;所以 不变的泛型类型参数既不是协变也不是 逆变。您无法分配IEnumerable的实例 (IEnumerable)到类型的变量 IEnumerable,反之亦然。
以下是https://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx
的参考资料我的建议是,尝试更改实现并将所有方法放入界面,这应该更清楚
class Root: Interface
{
...implementation of your common methods
}
class Derived: Interface
{
...implementation of your common methods
//this should just
public void DoSomething(MyClass myClass)
}
如果您不想使用上述方法,请使用" as"运算符将要传递的参数视为MyRootClass var a = parameter as MyRootClass
。如果a null ,那么您没有将正确的值传递给方法,或者直接检查类型。
如果建议你阅读这个主题:
http://amapplease.blogspot.com/2009/04/invariance-covariance-contravariance.html https://stackoverflow.com/a/13107168/819153 https://blogs.msdn.microsoft.com/ericlippert/2009/03/19/representation-and-identity/
希望这有帮助