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属性的事件类型,建议定义公共接口统一约束,后续匹配逻辑无需新增分支即可通用:
- 先定义公共接口:
public interface ICallEvent { MetaDataInformation MetaData { get; } }
- 让所有事件类实现该接口:
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; } }
- 匹配时直接判断接口类型即可:
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
相关产品推荐
相关产品推荐

