如何在C#代码中找到属性的来源

本文关键字:属性 代码 | 更新日期: 2023-09-27 18:26:28

我正试图将monodroid的TexturedCube示例从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上运行得很好,没有这一行,但作为一个学究,我也想把最后一行翻译出来!

如何在C#代码中找到属性的来源

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

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

所以代码可能看起来像

base.ContextRenderingApi <- GLVersion.ES1

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

编辑:使用Monodroid绘制OpenGL 2.0(使用OpenTK)看起来是相同的问题

是否可以保护GLContextVersion

来自F#规范:注意:该版本的F#语言不支持该系列和受保护的规范

你可以通过反射来完成。

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

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