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

时间:2013-12-20 04:25:44

标签: reflection f#

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

property.SetValue(object, newValue)

合理地失败,因为它需要

property.SetValue(object, Some(newValue))

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

let isOption (p:PropertyInfo) = p.PropertyType.Name.StartsWith("FSharpOption")

但必须有更好的方法,不是吗?我必须说,IsOption中没有方法FSharpType让我很奇怪。

1 个答案:

答案 0 :(得分:9)

您可以使用以下内容:

let isOption (p:PropertyInfo) = 
    p.PropertyType.IsGenericType &&
    p.PropertyType.GetGenericTypeDefinition() = typedefof<Option<_>>

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