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

时间:2013-08-05 00:08:09

标签: c# f# xamarin.android

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

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上运行得很好,但作为一个学究者,我也希望翻译最后一行!

2 个答案:

答案 0 :(得分:4)

我刚刚查看了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) 看起来像是同一个问题

答案 1 :(得分:3)

GLContextVersion可以受到保护吗?

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

你可以用反射来做。

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

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