2015-02-10 20 views
0

我看了一些关于java内部匿名类的其他答案,但我正在寻找特定于C#的Xamarin实现的东西。需要帮助将Java移植到C# - 如何处理匿名内部类?

我正在努力将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#代码?

如果我使用Tangible Software的Java to C#程序,它会创建一个名为“OrientationEventListenerAnonymousInnerClassHelper”的助手类 - 这很酷 - 不幸的是,它不能编译。我很乐意为此编写代码,但必须有一个可以逃脱我的方法。正如我所说,我会有很多。

代码有形软件生成这个样子的:

首先,它有一个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程序员喜欢他们匿名的内部类,我将会有很多这些工作要做。最佳做法是什么?

谢谢!

回答

0

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

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

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

Aasmund(不知道是谁downvoted你的答案。希望人们会说为什么...)问题:虽然改变大量生成的代码并不好玩,但它似乎比首先更改大量的Java源代码更合理,因此它可以生成正确的代码... doesn'它呢?或者我错过了什么? – MarkJoel60 2015-02-10 12:39:52

+1

我可以证实,使用'this'作为参数名称确实是一个错误 - 今天的转换器的构建将解决这个问题。 – 2015-02-10 15:35:16

+1

新版本现在修复了这个问题。请注意,有些人更喜欢使用委托来转换匿名内部类 - 我们不这样做的原因是它无法处理更一般的复杂情况。 – 2015-02-10 16:29:48