如何在基类对象上调用子类方法?

Mic*_*ren 3 c# polymorphism inheritance c#-2.0

我正在使用一个为我生成一堆类的库.

这些类都继承自公共基类,但该基类没有定义所有子类共有的几个方法.

例如:

SubClassA : BaseClass{
  void Add(ItemA item) {...}
  ItemA CreateNewItem() {...}
}

SubClassB: BaseClass{
  void Add(ItemB item) {...}
  ItemB CreateNewItem() {...}
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,基类没有这些方法.这会很棒:

BaseClass{
  // these aren't actually here, I'm just showing what's missing:
  abstract void Add(ItemBaseClass item);  // not present!
  abstract ItemBaseClass CreateNewItem(); // not present!
}
Run Code Online (Sandbox Code Playgroud)

由于我的A + B对象有一个公共基类,而Item对象有一个公共基类,所以我希望从多态的奇妙世界中受益.

不幸的是,由于常用方法实际上并不存在于基类中,我无法虚拟地调用它们.例如,这将是完美的:

BaseClass Obj;
Obj = GetWorkUnit(); // could be SubClassA or SubClassB

ItemBaseClass Item = Obj.CreateNewItem(); // Compile Fail: CreateNewItem() isn't in the base class

Item.DoSomething();

Obj.Add(Item); // Compile Fail: Add(...) isn't in the base class
Run Code Online (Sandbox Code Playgroud)

显然铸造工作,但后来我需要知道我有哪种类型会否定好处.

我如何"强制"调用这些方法?我并不担心得到一个没有实现我试图调用的方法的对象.我实际上可以在VB中做我想要的东西 - 我没有得到intellisense但是编译器很高兴并且它有效:

CType(Obj, Object).Add(Item) // Note: I'm using C#--NOT VB
Run Code Online (Sandbox Code Playgroud)

Againt,我无法控制这些类(我认为排除了部分类).

Meh*_*ari 6

如果不采用反射或其他脏技巧,则无法调用派生类的非虚方法.如果你想这样做,那么很容易:

// obj is your object reference.
obj.GetType().InvokeMember("MethodName", 
    System.Reflection.BindingFlags.InvokeMethod, null, obj, null /* args */)
Run Code Online (Sandbox Code Playgroud)