【发布时间】:2016-03-27 21:18:51
【问题描述】:
我正在尝试在给定程序集中查找具有特定属性和类型的 let 绑定。
例如,下面的类型和属性:
type TargetType = { somedata: string }
type MarkingAttribute() = inherit System.Attribute()
那我想在下面的模块中找值:
module SomeModule =
[<Marking>]
let valueIWantToFind = {somedata = "yoyo"}
所以我要找的是具有以下签名的函数(假设它适用于通用函数签名):
let valuesOfTypeWithAttribute<'t,'attr> (assembly: Assembly) : 't list = ...
我的徒劳尝试似乎因我不了解 F# 模块如何转换为 CLR(CLI?)类而受阻。
我有以下 FSI sn-p,但遗憾的是什么也没找到:
open System.Reflection
let types = Assembly.GetExecutingAssembly().GetTypes()
let fiWithAttribute (attributeType: System.Type) (fi: FieldInfo) =
fi.CustomAttributes
|> Seq.exists (fun attr -> attr.AttributeType = attributeType)
let fields =
types
|> Array.collect (fun t -> t.GetFields())
|> Array.filter (fiWithAttribute typeof<MarkingAttribute>)
任何帮助或指点将不胜感激。
【问题讨论】:
-
使用 GetMembers 代替 GetFields - ideone.com/UIRgay
-
要弄清楚内容是如何翻译的,请使用 ILSpy。
标签: f# system.reflection