【问题标题】:Need help porting Java to C# - How to handle anonymous inner class?需要帮助将 Java 移植到 C# - 如何处理匿名内部类?
【发布时间】:2015-02-10 02:38:24
【问题描述】:

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

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

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

我正在处理的 Java 代码 sn-p(其中之一)是这样的:

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

在 Xamarin 可识别的 C# 代码中如何最好地表达?

如果我使用 Tangible Software 的 Java to 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 程序员喜欢他们的匿名内部类,我将有很多这样的工作要做。这方面的最佳做法是什么?

谢谢!

【问题讨论】:

    标签: java c# xamarin


    【解决方案1】:

    Java 中(匿名)内部类的实例只能从外部类的实例中创建,并且内部实例包含对外部实例的引用——因此,OrientationEventListenerAnonymousInnerClassHelper 的结构似乎是合理的。但是,生成器使用this 作为参数名称并不是很聪明,因为这是 C#(以及 Java)中的保留字。将其重命名为其他任何名称,您应该一切顺利。

    编辑:我想更改大量生成的代码是不切实际的。参数名称可能派生自传递给匿名内部类的构造函数的任何内容,因此请在您的 Java 代码中尝试此操作,然后重新生成 C# 代码:

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

    【讨论】:

    • Aasmund(不知道谁对你的答案投了反对票。希望人们能说出原因……) 问题:虽然更改大量生成的代码并不有趣,但它似乎比首先更改大量 java 源代码,以便正确生成它......不是吗?或者我错过了什么?
    • 我可以确认使用“this”作为参数名称确实是一个错误——今天的转换器版本将解决这个问题。
    • 新版本现在解决了这个问题。请注意,有些人更喜欢使用委托来转换匿名内部类 - 我们不这样做的原因是它无法处理更一般的复杂情况。
    • @MarkJoel60:我也是... 答案取决于您对源代码的控制程度、更改的简单程度以及受它影响的人数 - 一次,我确实自己编写了一个脚本来修复错误生成的代码,所以这可能是一条可行的路线。幸运的是,Xamarin 人似乎修复了这个错误 :-)
    • 我知道...太棒了!但具体来说,DaveDoknjas 来自 Tangible Software。我认为我见过的最快的错误修复。肯定让我对我在那里的投资感觉很好。
    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 2020-08-19
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多