具有抽象基类的c#运行时多态性

具有抽象基类的c#运行时多态性,c#,object,polymorphism,runtime,C#,Object,Polymorphism,Runtime,我试图清理现有的代码库,但在使用抽象类的不同派生类的泛型引用名称时遇到了问题 例如: public abstract class Base<T> : Utilities.CommonRequiredObject { protected List<T> RawContents = new List<T>(); . . public abstract void LoadContents(List<T> Contents

我试图清理现有的代码库,但在使用抽象类的不同派生类的泛型引用名称时遇到了问题

例如:

public abstract class Base<T> : Utilities.CommonRequiredObject
{
    protected List<T> RawContents = new List<T>();
    .
    .

    public abstract void LoadContents(List<T> Contents);        // Each Class needs to load and process differently
    protected List<T> Contents;

    public virtual void DoSomething()           // Default here for common use. Defined in Each class for its specifics (if needed)
    {
    ...
    }
    public abstract List<T> FunctionToGetContents();

}

public class FOO : Base<string>
{
    public override void DoSomething() ...
    public override List<string> FunctionToGetContents() ...
}

public class BAR : Base<byte>
{
    public override void DoSomething() ...
    public override List<byte> FunctionToGetContents() ...
}
编辑: 根据我很快收到的评论(再次感谢大家),删除泛型(
Base
)并使类全部为Base()类型是否更好,然后我可以简单地将
ObjectToUse
定义为
Base ObjectToUse我相信。

这是办不到的

通过使用需要泛型类型参数的引用,必须为其提供一个泛型类型参数。您可以在这里使用
dynamic
,以便对类型进行运行时评估,但这是您将获得的最佳结果

即使使用模板方法模式之类的方法,也需要指定泛型类型参数。如果您只想使用
DoSomething
方法,则需要将其升级到更高的基类(或接口),以便保存对该类型的引用,并调用该(非泛型)函数

对于你的评论,我会采取这样的解决方案;将公共代码重构为基类中的模板方法模式。然后让“触发”函数是从非泛型基类(或接口)继承的非泛型成员。现在,您可以持有对该类型的引用,并调用template方法以引起其他调用的发生

public void DoAwesomeStuff() //inherited from non-generic parent or interface
{
   LoadContents(FunctionToGetContents());
   DoSomething();
}
然后:


这是行不通的。您的类
Base
Base
没有共同的祖先。为什么不使用接口呢?如果
FOO
BAR
都实现了刚刚声明了
DoSomething()
方法签名的
idomsomething
,那么您就可以开始工作了。@sjip实际上是这样的(CommonRequiredObject),但这对他没有任何好处。谢谢您的快速帮助。我试图避免的是做所有反对的事情。正在执行,在执行代码的if()中。类型越多,表示if()结构中重复的代码就越多。也许我可以将if()的逻辑移到基类中以返回一个新对象?@BradleyDotNET:是的,你说得对,否则
System.object
将是共同的祖先。我的意思是,Base和Base没有一个共同的祖先
Base
,或者可以共享代码的地方。你回答得对。好的。因此,这将移动到base()的父类,在我的代码中很可能是一个新类,因为Utilities.CommonRequiredObject有一些在许多地方共享的基本功能。Base:NewBase,然后将常用函数移到NewBase()。然后NewBase ObjectToUse()并调用ObjectToUse.DoAwesomeStuff()。@StevenScott为了避免修改您(可能常用)的基类,我只想将其添加到接口中,因为您可以成倍地继承这些基类。修改基本功能也可以。当然,“中间”基类也可以使用,不过我怀疑您是否需要它。@StevenScott如果您不想使用接口,您编辑的注释可以使用。谢谢您提供的信息。正在努力更改我的代码。我需要一个抽象基类的组合来实现一些常见的函数,并定义要在类中实现的函数,然后是您提到的接口。我的问题是该类仍然需要一些泛型,这就是我在移动/重新分解代码时遇到的当前问题。@StevenScott这不应该是一个问题,只要让您的泛型基类实现
IDoesAwesomeStuff
。也许我们应该去聊天?
if(variable)
{
    FOO ObjectToUse = new FOO();
}
else
{
    BAR ObjectToUse = new BAR();
}

ObjectToUse.LoadContents(ObjectToUse.FunctionToGetContents());
ObjectToUse.DoSomething();
...
public void DoAwesomeStuff() //inherited from non-generic parent or interface
{
   LoadContents(FunctionToGetContents());
   DoSomething();
}
IDoesAwesomeStuff ObjectToUse = new FOO();
ObjectToUse.DoAwesomeStuff();