反映F#中的C#类型

时间:2016-02-29 17:50:59

标签: c# reflection f#

我在Fsi会话中加载了一个C#dll。运行C#方法会返回一些C#类型。我已经编写了一个辅助函数来探索给定C#类型的属性。

程序失败并显示错误:

stdin(95,21): error FS0039: The type 'RuntimePropertyInfo' is not defined

这可能吗?还是我打死了一匹马?

let getPropertyNames (s : System.Type)=
    Seq.map (fun (t:System.Reflection.RuntimePropertyInfo) -> t.Name) (typeof<s>.GetProperties())

typeof<TypeName>.GetProperties() //seems to work.

我的目标只是打印出漂亮的C#字段。

更新

我想我已经找到了办法。它似乎工作。我无法回答自己。所以,我接受任何给出比这更好的例子的人的答案。

let getPropertyNames (s : System.Type)=
    let properties = s.GetProperties()
    properties 
        |> Array.map (fun x -> x.Name) 
        |> Array.iter (fun x -> printfn "%s" x) 

1 个答案:

答案 0 :(得分:2)

如评论中所述,您可以在类型注释中使用System.Reflection.PropertyInfo。您的代码也有typeof<s>,但s已经是System.Type类型的变量,因此您只需直接在GetProperties上致电s

let getPropertyNames (s : System.Type)=
    Seq.map (fun (t:System.Reflection.PropertyInfo) -> t.Name) (s.GetProperties())

getPropertyNames (typeof<System.String>)

您还可以使用pipe:

完全避免使用类型注释
let getPropertyNames (s : System.Type)=
    s.GetProperties() |> Seq.map (fun t -> t.Name)