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

如何在C中用匿名类重新实现Java侦听器#,java,c#,interface,listener,Java,C#,Interface,Listener,我正在尝试用C语言复制我的Java代码,我想知道如何用C语言复制这个Java功能 Util.java public class Util { public void function(String s, final SetAvailabilityStatusListener setStatusListener) { // .... } public static interface SetAvailabilityStatusListener {

我正在尝试用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);
    }
}
public class Activity
{
    public void anotherFunction()
    {
        util.function("name", new SetAvailabilityStatus()
            {
                @Override
                public void setAvailabilityStatus(Status status) {
                    loginSetAvailabilityStatus(status);
                }
            }
    }       
}
Activity.java

public class Util
{
    public void function(String s, final SetAvailabilityStatusListener setStatusListener)
    {
        // ....
    }

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

使用代理。它们用于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
    }


}
公共类Util
{
public void函数(字符串s,Action setStatusListener)
{
// ....
设置状态侦听器(“myStatus”);
}
}
公共课堂活动
{
private Util=new Util();
公共无效另一个功能()
{
函数(“名称”,状态=>LoginSetAvailabilityStatus(状态));
}
public void LoginSetAvailabilityStatus(字符串状态){
//对地位做点什么
}
}

我找不到合适的副本,因此:

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所建议的,您可以使用代理和:

公共类Util
{
public void函数(字符串s、操作状态ChangeListener)
{
// ....
}
}
公共课堂活动
{
公共无效另一个功能()
{
utilObj.Function(“名称”,
(状态)=>
{
loginSetAvailabilityStatus(状态);
}
}       
}
3.C#有另一种更简单的机制来处理事件处理(包容)机制-

公共类状态EventArgs:EventArgs
{
//...
}
公共类Util
{
公共函数()
{
// ....
if(this.OnAvailabilityChanged!=null)
OnAvailabilityChanged(这是新的StatusEventArgs(状态));
}
公共事件事件处理程序OnAvailabilityChanged
}
公共课堂活动
{
public void Availability StatusChangedHandler(对象发送方,EventArgs EventArgs)
{
}
公共无效另一个功能()
{
utilObj.OnAvailabilityChanged+=this.AvailabilityStatusChangedHandler;
}       
}

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

这到底是哪种Java功能?可能与我采用的@AndreySarafano给出的解决方案重复v但是我相信你分享的信息在我继续这个项目的过程中会非常有用。非常感谢。经过一番努力,我发现你的第三种方法最适合我的用例。但是当我使用
App.Current.Resources[“ResourceName”]
它提供了`无效的跨线程访问。`错误。我实际上是从AsyncCallback函数调用它。
public void UserAvailabilityCallback(IAsyncResult ar)
。据我所知,这是在单独的线程上运行的。请你建议一个修复方法。如果我在某个地方做错了,请纠正我。我正在使用
Deployment.Current.Dispatcher
来修复此问题。可以做些其他事情来代替此吗?@Prattor这是另一个与此问题没有直接关系的问题,所以你可能应该问我t作为一个全新的问题-这个问题已经达到了它的目的。在提出问题之前先阅读,以便更好地理解可能的问题和解决方案。我认为第一个选项是一个更有用的方法,因为它将更好地处理多个接口方法的情况,并且允许您维护从Java到C#的接口(通常不能用委托代替接口)。@DaveDoknjas是的,委托可以被戏称为穷人的观察者模式。它们是UI事件处理(在一个UI元素内)的有效解决方案,但对于任何更复杂的问题,最终都会使用更复杂的解决方案。