You need to enable JavaScript to run this app. C#中存储不同IOnlineTag实现类的集合如何获取对应类型的Value属性
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 21:15:03