gpt4 book ai didi

f# - 如何使用 f# interactive 访问私有(private)字段/方法/属性

转载 作者:行者123 更新时间:2023-12-04 23:33:35 25 4
gpt4 key购买 nike

F# interactive 是一个强大的开发工具,因为它允许运行 WinForm 或 Wpf 窗口并在其中调用任意代码。

这为“先试后编码”方法提供了一种方法。

很多时候,我希望明确地“打破界限”

  • 调用私有(private)/ protected 方法
  • 访问/更改私有(private)字段和属性

  • 是否有解决方法来实现这一目标?

    最佳答案

    FSI 不为此提供任何特定支持,但您可以使用反射来做您想做的事情。

    open System.Reflection
    let field = typeof<MyType>.GetField("fieldName", BindingFlags.NonPublic ||| BindingFlags.Instance)
    field.SetValue(myInstance, newVal)

    您可以更进一步并定义方法或运算符,以使这更容易。例如,您可以设置 F# 的动态赋值运算符来分配给私有(private)字段:
    let (?<-) o s v = 
    let field = (o.GetType()).GetField(s, BindingFlags.NonPublic ||| BindingFlags.Instance)
    field.SetValue(o,v)

    myInstance?fieldName <- newVal (* Note: no quotes around fieldName here *)

    下面是一些用于解析公共(public)或私有(private)字段、属性或方法的粗略代码。请注意,有很多方法会失败(特别是,尝试在重载方法上使用它是行不通的)。
    open System
    open System.Reflection
    open Microsoft.FSharp.Reflection

    type DynamicHelper =
    static member MkMethod<'t,'u> (mi:MethodInfo) o : 't -> 'u=
    let typ = typeof<'t>
    fun t ->
    let args =
    if (typ = typeof<unit>) then [||]
    else
    if not (FSharpType.IsTuple typ) then [| box t |]
    else
    FSharpValue.GetTupleFields t
    mi.Invoke(o, args) :?> 'u

    let (?) (o:'a) s : 'b =
    let ty = o.GetType()
    let field = ty.GetField(s, BindingFlags.Instance ||| BindingFlags.Public ||| BindingFlags.NonPublic)
    if field <> null then field.GetValue(o) :?> 'b
    else
    let prop = ty.GetProperty(s, BindingFlags.Instance ||| BindingFlags.Public ||| BindingFlags.NonPublic)
    if prop <> null then prop.GetValue(o, null) :?> 'b
    else
    let meth = ty.GetMethod(s, BindingFlags.Instance ||| BindingFlags.Public ||| BindingFlags.NonPublic)
    let d,r = FSharpType.GetFunctionElements(typeof<'b>)
    typeof<DynamicHelper>.GetMethod("MkMethod").MakeGenericMethod([|d;r|]).Invoke(null, [| box meth; box o |]) :?> 'b

    有了这个,您可以动态调用方法和属性,如下所示:
    let (t:System.Type) = "test"?GetType()?BaseType

    关于f# - 如何使用 f# interactive 访问私有(private)字段/方法/属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1666767/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com