C# 当我有许多具有相同属性的类,但它们在加载和刷新等方法上不同时,正确的方法是什么?

C# 当我有许多具有相同属性的类,但它们在加载和刷新等方法上不同时,正确的方法是什么?,c#,C#,类A、B和更多类的每个实例都是单例的,我希望能够使用foreach循环这些实例 abstract class Base { public int Property { get; set; } public abstract void Load(); } class A : Base { public override Load(){do stuff that A needs to decide how to set Property} } class B : Ba

类A、B和更多类的每个实例都是单例的,我希望能够使用foreach循环这些实例

abstract class Base 
{ 
    public int Property { get; set; }
    public abstract void Load();
}

class A : Base
{
    public override Load(){do stuff that A needs to decide how to set Property}
}

class B : Base
{
    public override Load(){do stuff that B needs to decide how to set Property}
}

这样行吗?如何创建这些不同对象的列表?

我认为您希望实现以下目标:

List<Base> list = new List<Base>();
list.Add(new A());
list.Add(new B());
foreach (var t in list) 
      t.Load();
List List=新列表();
添加(新的A());
添加(新的B());
foreach(列表中的变量t)
t、 加载();

首先,必须使用反射获取继承
基类的所有类型:

var types = myAssembly.GetTypes().Where(x => x.BaseType == typeof(Base));
现在获取这些类型的实例。由于您的所有类都是单实例,因此每个类只有一个实例。这假设您有一些属性,可以访问单个实例

var instances = types.GetProperty("Instance").GetValue(null);
现在将这些实例放入一个列表中并循环它们,以便调用
Load
-方法。正如您已经知道的,所有类型都派生自
Base
,您可以在循环时安全地将它们强制转换到该类:

foreach(Base instance in instances)
    instance.Load();

也许an可以帮助您解决问题在我看来,您应该使用
void Load()
方法创建一个
接口
。然后让Base实现您的接口
Base:ILoadable
,并在
A
B
中实现您的方法@OndrejTucny我想说,OP想要实现的目标非常清楚。如果你想在每个项目上循环,我想说每个类实现一个通用的
接口
。然后创建一个类型列表yourInterface@OndrejTucny我希望能够遍历包含一个A实例、一个B实例、一个C实例的列表,以此类推,在所有这些实例上调用Load@ČeněkSůva好吧,您有一个共同的祖先。那么你遇到了什么问题?继续并展示相关代码。这些类是单例的。你不能创建单例实例,因为它们的构造函数通常是私有的。我只是举了一个例子,说明如何在循环中使用抽象或接口与子类或实现。他已经不得不考虑其他步骤来实现他的逻辑。他还写了“类A,B的每个实例”,并注意编译时警告。如果C#编译器说成员A隐藏了另一个成员B。不要使用new关键字使警告消失。相反,从派生类中删除“额外”成员,或者,如果需要两个成员,则为新成员选择另一个与从基类继承的名称不冲突的名称。当然,如果您想专门化继承成员的行为,请使用virtual on base和override。