.net 如何获得两个列表,每个列表包含F#记录的必需和可选属性的名称?

.net 如何获得两个列表,每个列表包含F#记录的必需和可选属性的名称?,.net,reflection,properties,f#,record,.net,Reflection,Properties,F#,Record,我有一个F#记录类型 类型MyType={ 名称:string Description:字符串选项 } 我想得到两个数组,一个包含必需属性的名称,另一个包含可选属性。我如何才能做到这一点?开放系统。反射 ///灵感来自https://stackoverflow.com/questions/20696262/reflection-to-find-out-if-property-is-of-option-type let等参点(p:PropertyInfo)= p、 PropertyType.Is

我有一个F#记录类型

类型MyType={
名称:string
Description:字符串选项
}
我想得到两个数组,一个包含必需属性的名称,另一个包含可选属性。我如何才能做到这一点?

开放系统。反射
///灵感来自https://stackoverflow.com/questions/20696262/reflection-to-find-out-if-property-is-of-option-type
let等参点(p:PropertyInfo)=
p、 PropertyType.IsGenericType&&
p、 PropertyType.GetGenericTypeDefinition()=typedefof
///类型“T”的必需和可选属性名称-按该顺序排列
///灵感来自https://stackoverflow.com/questions/14221233/in-f-how-to-pass-a-type-name-as-a-function-parameter
///灵感来自https://stackoverflow.com/questions/59421595/is-there-a-way-to-get-record-fields-by-string-in-f
设requiredAndOptionalPropertiesOf.GetProperties()|>Array.partition等选项
让getNames(properties:PropertyInfo[])=properties |>Array.map(fun f->f.Name)
(getNames必填项,getNames可选项)

这里有一个备选答案,考虑了@Asti的评论:

开放系统。反射
let等参点(p:PropertyInfo)=
p、 PropertyType.IsGenericType&&
p、 PropertyType.GetGenericTypeDefinition()=typedefof
设|>Array.partition等值线的Required和OptionalProperties
让getNames(properties:PropertyInfo[])=properties |>Array.map(fun f->f.Name)
(getNames必填项,getNames可选项)

我更喜欢使用
FSharpType.GetRecordFields-typeof
,这样,如果规范发生变化,它不会破坏任何东西。我添加了一个替代答案“反映”您的评论(双关语)。
FSharp.Reflection.FSharpType.GetRecordFields
如何比
typeof
GetRecordFields
更安全是API表面的一部分,即使属性映射到记录字段的内部实现发生变化,API行为也将保持不变。也就是说,如果T不是记录类型,
GetRecordFields
将抛出,并且只返回具有字段映射的属性(即,
compilemappingAttribute
已应用),并遵守声明的顺序。