我使用反射用数据填充一些对象的字段。由于我的对象是F#类型,它有一些Option
字段。如果是选项
property.SetValue(object, newValue)
合理地失败,因为它需要
property.SetValue(object, Some(newValue))
因此,我试图找出属性是否为Option
类型。我可以这样做:
let isOption (p:PropertyInfo) = p.PropertyType.Name.StartsWith("FSharpOption")
但必须有更好的方法,不是吗?我必须说,IsOption
中没有方法FSharpType
让我很奇怪。
答案 0 :(得分:9)
您可以使用以下内容:
let isOption (p:PropertyInfo) =
p.PropertyType.IsGenericType &&
p.PropertyType.GetGenericTypeDefinition() = typedefof<Option<_>>
基本上,GetGenericTypeDefinition
返回属性的泛型类型,不带任何类型参数。并且typedefof
执行非常类似的操作,仅使用编译时类型信息。在这种情况下,它将返回Option<>
,没有任何参数。然后,您可以简单地比较它们以查看它们是否属于同一类型。