【问题标题】:How do I find the origin of a property in C# code?如何在 C# 代码中找到属性的来源?
【发布时间】:2013-08-08 09:50:33
【问题描述】:

我正在尝试将 TexturedCube example for monodroid 从 C# 转换为 F# 并点击这行 C# 代码(来自 PaintingView 类的 CreateFrameBuffer 方法):

GLContextVersion <- GLContextVersion.Gles1_1

在 F# 中,我必须明确说明 GLContextVersion 的来源,但我找不到它,因为爱情和金钱。例如,如果PaintingView 实现了一个暴露此GLContextVersion 属性的接口,那么我相信我必须将this 向上转换为该接口类型才能调用该属性。

根据文档,AndroidGameView(从中派生出PaintingView)实现了此属性,但以下因Error FS0039: The field, constructor or member 'GLContextVersion' is not defined (FS0039) (TexturedCube) 而失败:

base.GLContextVersion <- GLContextVersion.Gles1_1

我的 F# 程序在没有这行的 Nexus 7 上运行得很好,但是,作为一个学究,我也想翻译最后一行!

【问题讨论】:

  • 你不能“去定义”吗?
  • @SimonWhitehead:我试过了,它把我带到了AndroidGameView.GLContextVersion,但似乎无法从 F# 访问。

标签: c# f# xamarin.android


【解决方案1】:

我刚刚查看了 Xamarin 中的代码(它有一个非常简洁的程序集浏览器,可以显示反编译的代码!)。

在我看来,OpenTK-1.0 中确实不存在该属性(在 Android OpenGL 示例中默认引用),并且看起来已被 ContextRenderingAPI 取代(?)。

所以代码可能看起来像

base.ContextRenderingApi <- GLVersion.ES1

查看为 C# 版本提供的源代码,它是 OpenTK 而不是引用 OpenTK-1.0,因此很可能是一个破坏性的 API 更改,而不是 C#/F# 问题。

编辑: OpenGL 2.0 Drawing with Monodroid (using OpenTK) 好像是同一个问题

【讨论】:

    【解决方案2】:

    GLContextVersion 可以保护吗?

    来自 F# 规范:注意:此版本的 F# 语言不支持族规范和受保护规范。

    你可以使用反射来做到这一点。

    正如 F# 规范所述,您可以在实例化期间使用对象表达式访问受保护的成员。如果您使用对象表达式而不是子类进行实例化,它似乎可以工作。使用 Windows 窗体的示例:

    {
        new System.Windows.Forms.Form() with
            override this.CreateControlsInstance() =
                System.Windows.Forms.Control.ControlCollection(this)
    }
    

    【讨论】:

    • 好主意,但跳转到定义怎么会把我带到AndroidGameView 上的一个属性,即public?对象表达式的问题是我显然需要一个具有两个构造函数的类才能遵守 API。
    猜你喜欢
    • 1970-01-01
    • 2021-08-14
    • 2021-01-16
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多