如何使用Fire.ly .NET SDK推断FHIR 'choice'属性的正确数据类型
读取Firely .NET SDK中FHIR Choice属性的正确方式
你的初始代码是可行的,但可以通过更严谨的方式处理,同时避免空引用风险:
基础判断逻辑
当FHIR数据中未设置Deceased字段时,patient.Deceased会是null,用as转换后的变量也会是null,不会抛出异常。建议先通过SDK提供的HasXXX()方法判断属性是否存在,再做类型转换:if (patient.HasDeceased()) { var deceasedDateTime = patient.Deceased as FhirDateTime; if (deceasedDateTime != null) { // 处理逝者日期逻辑,例如获取日期值 var deathDate = deceasedDateTime.Value; } var deceasedBool = patient.Deceased as FhirBoolean; if (deceasedBool != null) { // 处理逝者布尔值逻辑,例如获取是否已故的标识 var isDeceased = deceasedBool.Value; } }更优雅的模式匹配(C# 7.0+)
利用C#的模式匹配可以让类型判断和逻辑处理更集中,代码可读性更高:if (patient.Deceased is var deceasedValue && deceasedValue != null) { switch (deceasedValue) { case FhirDateTime dt: var deathDate = dt.Value; // 执行日期类型的下游处理逻辑 break; case FhirBoolean b: var isDeceased = b.Value; // 执行布尔类型的下游处理逻辑 break; default: // 处理未预期的类型(如果有扩展类型的需求) break; } }
关键说明:
- Firely SDK生成的POCO类中,每个Choice属性都会配套生成
HasXXX()方法(如HasDeceased()),用于快速判断该属性是否已被赋值,比直接判断null更直观。 - 无论哪种方式,当属性未设置时,
patient.Deceased为null,不会触发类型转换后的逻辑分支,无需额外处理空指针异常。
内容的提问来源于stack exchange,提问作者Jaffacakes82
相关产品推荐
相关产品推荐

