C#中存储不同IOnlineTag实现类的集合如何获取对应类型的Value属性
方案1:修改IOnlineTag接口定义(推荐,符合面向对象设计原则)
直接在接口层统一声明Value的访问契约,后续不需要每次遍历都做类型判断。
首先修改接口定义:
public interface IOnlineTag { string Name { get; set; } // 新增object类型的Value属性作为统一访问入口 object Value { get; } }
再修改两个实现类适配接口要求:
public class OnlineDoubleTag : IOnlineTag { public string Name { get; set; } public double Value { get; set; } // 显式实现接口的Value属性,直接返回已有的强类型Value object IOnlineTag.Value => Value; } public class OnlineBoolTag : IOnlineTag { public string Name { get; set; } public bool Value { get; set; } object IOnlineTag.Value => Value; }
修改后原有遍历代码可以直接正常取值:
foreach (var tag in onlinetags) { Console.WriteLine(tag.Value); }
注:如果使用泛型接口
public interface IOnlineTag<T> { T Value { get; } },两个类分别实现IOnlineTag<bool>和IOnlineTag<double>,但因为泛型类型参数不同,两个实现类属于不同的接口实现,无法放入同一个List<IOnlineTag<T>>集合,所以此处使用object类型的统一访问入口是更适配需求的选择。
方案2:使用模式匹配判断类型(适合无法修改IOnlineTag接口定义的场景)
不需要调整原有接口和类的代码,直接在遍历环节做类型分支判断即可:
foreach (var tag in onlinetags) { object value = tag switch { OnlineBoolTag boolTag => boolTag.Value, OnlineDoubleTag doubleTag => doubleTag.Value, _ => "不支持的标签类型" }; Console.WriteLine(value); }
如果是低版本C#不支持switch表达式,也可以用if分支实现:
foreach (var tag in onlinetags) { if (tag is OnlineBoolTag boolTag) { Console.WriteLine(boolTag.Value); } else if (tag is OnlineDoubleTag doubleTag) { Console.WriteLine(doubleTag.Value); } }
内容的提问来源于stack exchange,提问作者Maksim SD
相关产品推荐
相关产品推荐

