C#如何根据枚举值运行时生成子类List并以基类List<A>类型返回
解决方案
你提到的B1和B2的info属性类型差异,并不影响List<A>类型的返回逻辑:因为基类A本身不包含info属性定义,返回的集合仅要求元素为A的派生类实例即可,类型差异只会在你需要访问具体子类的info属性时才需要处理。
基础实现方案
1. 方法核心实现
C#中List<T>不支持协变直接赋值,你可以通过Cast<T>()方法将子类集合转换为List<A>返回,示例代码如下:
首先补充枚举定义参考:
public enum typeEnum { B1Type, B2Type }
方法实现代码:
public List<A> function(typeEnum t) { switch (t) { case typeEnum.B1Type: // 按业务需求构造B1类型集合 List<B1> b1List = new List<B1> { new B1 { ID = 1, tag = "B1实例1", info = 100 }, new B1 { ID = 2, tag = "B1实例2", info = 200 } }; return b1List.Cast<A>().ToList(); case typeEnum.B2Type: // 按业务需求构造B2类型集合 List<B2> b2List = new List<B2> { new B2 { ID = 3, tag = "B2实例1", info = new C() }, new B2 { ID = 4, tag = "B2实例2", info = new C() } }; return b2List.Cast<A>().ToList(); default: throw new ArgumentOutOfRangeException(nameof(t), "不支持的枚举参数"); } }
2. 访问子类info属性的处理方案
拿到返回的List<A>后如果需要使用info属性,通过类型匹配判断即可:
List<A> result = function(typeEnum.B1Type); foreach (A item in result) { if (item is B1 b1Item) { // 访问int类型的info Console.WriteLine($"B1的info值:{b1Item.info}"); } else if (item is B2 b2Item) { // 访问C类型的info Console.WriteLine($"B2的info值:{b2Item.info}"); } }
优化方案:基类统一暴露info入口
如果你希望在基类层面可以直接访问info属性,不需要每次做类型判断,可以将A改为抽象类,添加抽象的Info属性:
public abstract class A { public int ID { get; set; } public string tag { get; set; } // 基类统一暴露Info,返回object类型适配不同子类的属性类型 public abstract object Info { get; } } public class B1 : A { public int info { get; set; } public override object Info => info; } public class B2 : A { public C info { get; set; } public override object Info => info; }
修改后你可以直接通过A类型的实例访问Info属性,如需强类型操作再自行转换即可。
内容的提问来源于stack exchange,提问作者hcurtillet
相关产品推荐
相关产品推荐

