从各种List <derivedClass <T >>创建List <genericBaseClass <T >>

kay*_*man 2 c# generics inheritance list

对于某些上下文 - 这是早期问题的扩展.

使用List <derivedClass>覆盖List <baseClass>

无论如何,

我有一个通用的基类"场景"

public class Scene<T> where T: SceneModel { }
Run Code Online (Sandbox Code Playgroud)

我还有两个继承自这个的类:

public class WorldScene : Scene<WorldModel> { }
public class BattleScene : Scene<BattleModel> { }
Run Code Online (Sandbox Code Playgroud)

现在我需要做的是List<Scene<SceneModel>>包含WorldScene和BattleScene的混合物.在我需要列表的地方,我显然只需要使用WorldScene和BattleScene常用的属性/方法.

我知道它们是两个截然不同的对象 - 但是考虑到它们继承了同样的东西 - 我希望有一种聪明的方法可以用这种方式对它们进行分组,而无需手动将它们转换为第三种类型.

dtb*_*dtb 5

如果Scene <T>的方法和属性允许,你可以定义一个协变通用接口 IScene <out T>,Scene <T>实现:

public interface IScene<out T> where T : SceneModel { }
    // use of T is limited to return values and out parameters

public class Scene<T> : IScene<T> where T : SceneModel { }

List<IScene<SceneModel>> list = new List<IScene<SceneModel>>();
list.Add(new WorldScene());
list.Add(new BattleScene());

foreach (IScene<SceneModel> scene in list) ...
Run Code Online (Sandbox Code Playgroud)

如果没有,您可以使用非泛型接口或非泛型基类,但不能在定义中包含泛型成员:

public interface IScene { }
    // no T

public class Scene<T> : IScene where T : SceneModel { }

List<IScene> list = new List<IScene>();
list.Add(new WorldScene());
list.Add(new BattleScene());

foreach (IScene scene in list) ...
Run Code Online (Sandbox Code Playgroud)