传递接口作为参数

时间:2015-12-22 14:30:42

标签: c# android bluetooth bluetooth-lowenergy

我为altbeacon阅读了以下示例,该示例编写为Java(http://altbeacon.github.io/android-beacon-library/samples.html)。我必须将代码翻译成c#..

    @Override
public void onBeaconServiceConnect() {
    beaconManager.setMonitorNotifier(new MonitorNotifier() {
    @Override
    public void didEnterRegion(Region region) {
        Log.i(TAG, "I just saw an beacon for the first time!");        
    }

    @Override
    public void didExitRegion(Region region) {
        Log.i(TAG, "I no longer see an beacon");
    }

    @Override
        public void didDetermineStateForRegion(int state, Region region) {
        Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+state);        
        }
    });

    try {
        beaconManager.startMonitoringBeaconsInRegion(new Region("myMonitoringUniqueId", null, null, null));
    } catch (RemoteException e) {    }
}

我这样开始现在我在传递接口参数时遇到了问题,就像在上面提到的例子中那样..

        public void OnBeaconServiceConnect()
    {
        beaconManager.SetMonitorNotifier(...)
     }

有人可以解释如何将代码翻译成c#?

2 个答案:

答案 0 :(得分:1)

我认为你真正的问题是"是否有相当于C#中的匿名类?"。答案是否定的。

看看Java: Interface with new keyword how is that possible?。 Java支持定义在方法中实现接口的匿名类。在定义实现接口的私有类时,它只是语法糖(或盐,取决于对此功能的看法)。

因此,将此代码转换为C#时的解决方案是创建一个私有内部类并在方法中使用它:

class SomeClass
{
    ...
    public void OnBeaconServiceConnect() 
    {
        beaconManager.SetMonitorNotifier(new MonitorNotifier());
        ...
    }

    ...

    private MonitorNotifier : IMonitorNotifier
    {
        public void didEnterRegion(Region region) 
        {
            Log.i(TAG, "I just saw an beacon for the first time!");       
        }

        public void didExitRegion(Region region) 
        {
            Log.i(TAG, "I no longer see an beacon");
        }

        public void didDetermineStateForRegion(int state, Region region) 
        {
            Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+state);        
        }
    }
}

答案 1 :(得分:0)

匿名类无法在C#中实现接口。 所以不要在这里使用匿名类:

    public class MyMonitorNotifier : MonitorNotifier {
...
}

然后:

 beaconManager.SetMonitorNotifier(new MyMonitorNotifier ());