You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何检测泛型嵌套类型并获取MetaDataInformation类属性

实现方案

方案1:使用属性模式匹配(适用于C# 8.0及以上版本)

可以直接在模式匹配的case语句中嵌套提取属性,无需单独声明变量,两个匹配分支可以共享同一个提取后的MetaData变量:

public void DetermineType<T>(T callEvent)
{
    switch (callEvent)
    {
        case CallAnswered { MetaData: var meta }:
        case CallAbandoned { MetaData: var meta }:
            // 直接使用meta变量访问嵌套属性
            Console.WriteLine($"事件接收时间:{meta.ReceivedAt}");
            Console.WriteLine($"事件应答时间:{meta.AnsweredAt}");
            break;
    }
}

方案2:提取公共接口(可维护性更高,适合多事件类型的场景)

如果后续会新增更多带MetaData属性的事件类型,建议定义公共接口统一约束,后续匹配逻辑无需新增分支即可通用:

  1. 先定义公共接口:
public interface ICallEvent
{
    MetaDataInformation MetaData { get; }
}
  1. 让所有事件类实现该接口:
public class CallAnswered : ICallEvent
{
    public string Caller { get; set; }
    public MetaDataInformation MetaData { get; set; }
}

public class CallAbandoned : ICallEvent
{
    public string ReasonForAbandonment { get; set; }
    public MetaDataInformation MetaData { get; set; }
}
  1. 匹配时直接判断接口类型即可:
public void DetermineType<T>(T callEvent)
{
    if (callEvent is ICallEvent callEventWithMeta)
    {
        var meta = callEventWithMeta.MetaData;
        // 处理MetaData逻辑
    }

    // 其他类型的匹配逻辑
}

方案3:低版本C#兼容方案

如果使用的C#版本不支持属性模式,分开处理两个case分支,把MetaData处理逻辑封装为公共方法调用即可:

public void DetermineType<T>(T callEvent)
{
    switch (callEvent)
    {
        case CallAnswered callAnswered:
            ProcessMetaData(callAnswered.MetaData);
            // 其他CallAnswered专属逻辑
            break;
        case CallAbandoned callAbandoned:
            ProcessMetaData(callAbandoned.MetaData);
            // 其他CallAbandoned专属逻辑
            break;
    }
}

// 公共处理方法
private void ProcessMetaData(MetaDataInformation meta)
{
    // 处理MetaData逻辑
}

内容的提问来源于stack exchange,提问作者Mekroebo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:15:03