【问题标题】:Reflection to find out if property is of option type反思以确定属性是否属于选项类型
【发布时间】:2013-12-20 04:25:43
【问题描述】:

我正在使用反射填充一些对象的字段。由于我的对象是 F# 类型,它有一些 Option 字段。在选项的情况下

property.SetValue(object, newValue)

合理的失败,因为它需要

property.SetValue(object, Some(newValue))

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

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

但是一定有更好的方法,不是吗?而且我必须说我很奇怪IsOptionFSharpType 中没有方法。

【问题讨论】:

    标签: reflection f#


    【解决方案1】:

    你可以这样使用:

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

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

    【讨论】:

    • 感谢您的及时回复。我们可以写typedefof&lt;Option&lt;_&gt;&gt; 以避免不必要的int 吗?
    • 我刚刚发现这个解决方案效果很好,但只适用于泛型类型的属性;对于非泛型属性,不幸的是它会抛出 InvalidOperationException。我们当然可以在异常处理分支中捕获它并返回 false,但对我来说变得太复杂了
    • @Rustam 抱歉,是的,这是个问题。请参阅我的更新答案以获得更好的解决方案。
    猜你喜欢
    • 2020-01-01
    • 2015-02-19
    • 2022-07-23
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多