如何在c#中使用匿名类重新实现Java侦听器

本文关键字:新实现 实现 侦听器 Java | 更新日期: 2023-09-27 18:15:27

我正在尝试在c#中复制我的Java代码,我想知道如何在c#中复制这个Java功能。

Util.java

public class Util
{
    public void function(String s, final SetAvailabilityStatusListener setStatusListener)
    {
        // ....
    }
    public static interface SetAvailabilityStatusListener {
        public void setAvailabilityStatus(Status status);
    }
}

Activity.java

public class Activity
{
    public void anotherFunction()
    {
        util.function("name", new SetAvailabilityStatus()
            {
                @Override
                public void setAvailabilityStatus(Status status) {
                    loginSetAvailabilityStatus(status);
                }
            }
    }       
}

如何在c#中使用匿名类重新实现Java侦听器

使用委托。它们在c#中使用,而不是在Java中实现接口的匿名类。

public class Util
{
    public void Function(String s, Action<Status> setStatusListener)
    {
        // ....
        setStatusListener("myStatus");
    }
}
public class Activity
{
    private Util util = new Util();
    public void AnotherFunction()
    {
        util.Function("name", status => LoginSetAvailabilityStatus(status));
    }
    public void LoginSetAvailabilityStatus(string status){
        //do something with status
    }

}

我找不到合适的副本,所以:

1。 c#不像Java那样有匿名类,但是没有人阻止你手动创建所需的侦听器类

public class Util
{
    public void Function(String s, ISetAvailabilityStatusListener setStatusListener)
    {
        // ....
    }
    public interface ISetAvailabilityStatusListener {
        public void SetAvailabilityStatus(Status status);
    }
}
public class Activity
{
    private class MySetAvailabilityStatusListener: Util.ISetAvailabilityStatusListener
    {
        public void SetAvailabilityStatus(Status status) 
        {
            // do your handling, but nested classes have some differences with anonymous Java classes, so it may require additional infrastructure.
        }
    }
    public void AnotherFunction()
    {
        utilObj.Function("name", 
            new MySetAvailabilityStatusListener())
    }       
}

这就是所谓的观察者设计模式(只是没有取消注册的方法!!)

2。正如@AndreySarafanov已经建议的那样,你可以使用Action delegate和lambda表达式:

public class Util
{
    public void Function(String s, Action<Status> statusChangeListener)
    {
        // ....
    }
}
public class Activity
{
    public void AnotherFunction()
    {
        utilObj.Function("name", 
            (status) => 
            {
                loginSetAvailabilityStatus(status);
            }
    }       
}

3。 c#有另一种更简单的机制来处理事件处理(订阅)机制——事件和委托

public class StatusEventArgs : EventArgs
{
    //...
}
public class Util
{
    public void SomeFunction()
    {
        // ....
        if (this.OnAvailabilityChanged != null)
            OnAvailabilityChanged(this, new StatusEventArgs(status));
    }
    public event EventHandler<StatusEventArgs> OnAvailabilityChanged
}
public class Activity
{
    public void AvailabilityStatusChangedHandler(object sender, EventArgs<Status> eventArgs) 
    {
    }
    public void AnotherFunction()
    {
        utilObj.OnAvailabilityChanged += this.AvailabilityStatusChangedHandler;
    }       
}

它不允许您将name属性与事件处理程序关联,好吧,您可以使用特殊的注册方法来克服它,但它会降低事件的可用性,因此您可能应该坚持使用另一种解决方案