c# - 从各种 List<衍生类 <T>> 创建 List<genericBaseClass<T>>

标签 c# list generics inheritance

对于某些上下文 - 这是先前问题的扩展。

override List<baseClass> with List<derivedClass>

无论如何,

我有一个通用基类“Scene”

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

我还有两个继承于此的类:

public class WorldScene : Scene<WorldModel> { }
public class BattleScene : Scene<BattleModel> { }

现在我需要做的是有一个 List<Scene<SceneModel>>其中包含世界场景和战斗场景的混合。在我需要列表的地方,我显然只需要使用 WorldScene 和 BattleScene 通用的属性/方法。

我知道它们是两个截然不同的对象 - 但鉴于它们继承自同一事物 - 我希望有一些聪明的方法以这种方式对它们进行分组,而无需手动将它们转换为第三种类型。

最佳答案

如果 Scene 的方法和属性允许,您可以定义 covariant generic interface Scene 实现的 IScene:

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) ...

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

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) ...

关于c# - 从各种 List<衍生类 <T>> 创建 List<genericBaseClass<T>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13242658/

相关文章:

list - 如何在 Haskell 中根据某些条件拆分列表?

list - 使用 Python (Google Maps API) 从地理编码结果列表中提取纬度/经度

java - 缩小 Java 字段类型而不使封闭类通用?

c# - Azure 服务总线每隔一段时间发送消息

c# - Asp.Net WebApi。 HttpPost 是默认的?

python - 最好的方法是根据元组的第一个元素重新排列元组列表以匹配字符串?

swift - 如何在 Swift 中创建接受 Double 和 Int 的泛型类

java - Lambda 表达式和通用接口(interface)

c# - 上传图片并相应地在 gridview 中显示其缩略图

c# - 如何使用存储过程从 SQL Server 获取数据