需要帮助将Java移植到C# - 如何处理匿名内部类?

时间:2015-02-10 02:38:25

标签: java c# xamarin

我已经查看了有关java内部匿名类的其他一些答案,但我正在寻找特定于C#的Xamarin实现的内容。

我正在努力将openCamera项目(http://opencamera.sourceforge.net/)从java移到Xamarin的C#。

我正在努力找出处理java的匿名内部类的最佳方法。

我正在研究的Java代码片段(其中之一)就是:

    orientationEventListener = new OrientationEventListener(this) {
        @Override
        public void onOrientationChanged(int orientation) {
            MainActivity.this.onOrientationChanged(orientation);
        }
    };

Xamarin最能表达的是C#代码?

如果我使用有形软件的Java到C#程序,它会创建一个名为" OrientationEventListenerAnonymousInnerClassHelper" - 很酷 - 不幸的是,它没有编译。我很高兴手工编写代码,但必须有一种光滑的方式来做到这一点让我感到厌烦。正如我所说,我将会有很多。

Tangible Software生成的代码如下所示:

首先,它使用如下的using语句声明它:

using OrientationEventListener = android.view.OrientationEventListener;

然后它创建它来处理匿名内部类:

private class OrientationEventListenerAnonymousInnerClassHelper : OrientationEventListener
{
    private readonly MainActivity outerInstance;

    public OrientationEventListenerAnonymousInnerClassHelper(MainActivity outerInstance, net.opencamera.MainActivity this) : base(this)
    {
        this.outerInstance = outerInstance;
    }

    public override void onOrientationChanged(int orientation)
    {
        outerInstance.onOrientationChanged(orientation);
    }
}

Xamarin工作室抱怨使用net.opencamera.MainActivity this,FWIW。

由于Java程序员喜欢他们的匿名内部课程,我将会有很多这样的课程要完成。这是什么最好的做法?

谢谢!

1 个答案:

答案 0 :(得分:0)

Java中的(匿名)内部类的实例只能在外部类的实例中创建,而内部实例包含对外部实例的引用 - 因此,OrientationEventListenerAnonymousInnerClassHelper的结构似乎合理。但是,生成器使用this作为参数名称并不是很聪明,因为这是C#(以及Java)中的保留字。把它重命名为其他任何东西,你应该好好去。

编辑:我想改变大量生成的代码是不切实际的。参数名称可能是从传递给匿名内部类的构造函数的任何内容派生而来的,所以在Java代码中尝试这个,然后重新生成C#代码:

ContainingClassName self = this;
orientationEventListener = new OrientationEventListener(self) { ... }