将派生类的传递实例限制为方法参数

时间:2017-02-22 13:43:48

标签: c# .net

以下是这种情况。我有一个类和一个派生类

public class MyClass
{  }

public class MyDerivedClass : MyClass
{  }

我还有一个方法(在外部类中),它以MyClass的实例作为参数:

public class AnotherClass {
  public void DoSomething(MyClass myClass) 
  { }
}

如何限制DoSomething方法仅接受MyClass的实例,而不接受MyDerivedClass的实例?

2 个答案:

答案 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/

希望这有帮助