Reflection 反射以确定属性是否为选项类型

Reflection 反射以确定属性是否为选项类型,reflection,f#,Reflection,F#,我使用反射用数据填充一些对象的字段。由于我的对象是F#类型,因此它有一些选项字段。如有选择 property.SetValue(object, newValue) 合理地失败,因为它需要 property.SetValue(object, Some(newValue)) 因此,我试图找出属性的类型是否为Option。我可以这样做: let isOption (p:PropertyInfo) = p.PropertyType.Name.StartsWith("FSharpOption") l

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

property.SetValue(object, newValue)
合理地失败,因为它需要

property.SetValue(object, Some(newValue))
因此,我试图找出属性的类型是否为
Option
。我可以这样做:

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

但一定有更好的办法,不是吗?我必须说,我很奇怪,在
FSharpType

中没有方法
IsOption
,您可以使用这样的方法:

let isOption (p:PropertyInfo) = p.PropertyType.Name.StartsWith("FSharpOption")
let isOption (p:PropertyInfo) = 
    p.PropertyType.IsGenericType &&
    p.PropertyType.GetGenericTypeDefinition() = typedefof<Option<_>>
let等参变量(p:PropertyInfo)=
p、 PropertyType.IsGenericType&&
p、 PropertyType.GetGenericTypeDefinition()=typedefof

基本上,返回不带任何类型参数的属性的泛型类型。并且做了一些非常类似的事情,只使用编译时类型信息。在这种情况下,它将返回
选项
,不带任何参数。然后,您可以简单地比较它们,看看它们是否属于同一类型。

感谢您的及时回复。我们是否可以编写
typedefof
,以避免不必要的
int
?我刚刚发现这个解决方案非常有效,但只适用于泛型类型的属性;不幸的是,对于非泛型属性,它抛出InvalidOperationException。我们当然可以在异常处理分支中捕获它并返回false,但对于me@Rustam对不起,是的,这是个问题。有关更好的解决方案,请参阅我的更新答案。