反思以确定属性是否属于选项类型

Rus*_*tam 5 reflection f#

我使用反射用数据填充一些对象的字段.由于我的对象是F#类型,它有一些Option字段.如有选择权

property.SetValue(object, newValue)
Run Code Online (Sandbox Code Playgroud)

合理地失败,因为它需要

property.SetValue(object, Some(newValue))
Run Code Online (Sandbox Code Playgroud)

因此,我试图找出一个属性是否类型Option.我可以这样做:

let isOption (p:PropertyInfo) = p.PropertyType.Name.StartsWith("FSharpOption")
Run Code Online (Sandbox Code Playgroud)

但必须有更好的方法,不是吗?我必须说,这是奇怪,我有没有方法IsOptionFSharpType.

p.s*_*w.g 9

你可以使用这样的东西:

let isOption (p:PropertyInfo) = 
    p.PropertyType.IsGenericType &&
    p.PropertyType.GetGenericTypeDefinition() = typedefof<Option<_>>
Run Code Online (Sandbox Code Playgroud)

基本上,GetGenericTypeDefinition返回属性的泛型类型,不带任何类型参数.并且typedefof做了非常类似的事情,仅使用编译时类型信息.在这种情况下,它将返回Option<>,没有任何参数.然后,您可以简单地比较它们以查看它们是否是相同的类型.