我使用反射用数据填充一些对象的字段.由于我的对象是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)
但必须有更好的方法,不是吗?我必须说,这是奇怪,我有没有方法IsOption在FSharpType.
你可以使用这样的东西:
let isOption (p:PropertyInfo) =
p.PropertyType.IsGenericType &&
p.PropertyType.GetGenericTypeDefinition() = typedefof<Option<_>>
Run Code Online (Sandbox Code Playgroud)
基本上,GetGenericTypeDefinition返回属性的泛型类型,不带任何类型参数.并且typedefof做了非常类似的事情,仅使用编译时类型信息.在这种情况下,它将返回Option<>,没有任何参数.然后,您可以简单地比较它们以查看它们是否是相同的类型.
| 归档时间: |
|
| 查看次数: |
714 次 |
| 最近记录: |