C# 如何将回调方法传递给C中的另一个类#

C# 如何将回调方法传递给C中的另一个类#,c#,dll,callback,delegates,C#,Dll,Callback,Delegates,我使用的是C#,我创建了一个应用程序A和一个动态链接库B。 我希望能够做到以下几点: 在应用程序A中,创建我的回调方法: public void MyAppMethod(string inComing){ Debug.WriteLine("callback returned: " + inComing); } 在appa中,在B中设置回调方法,如B.SetCallback(MyAppMethod) 在DLL B中,使用回调返回字符串: private void SomeMethod(

我使用的是C#,我创建了一个应用程序A和一个动态链接库B。 我希望能够做到以下几点:

  • 在应用程序A中,创建我的回调方法:

    public void MyAppMethod(string inComing){
        Debug.WriteLine("callback returned: " + inComing);
    }
    
  • 在appa中,在B中设置回调方法,如
    B.SetCallback(MyAppMethod)

  • 在DLL B中,使用回调返回字符串:

    private void SomeMethod(){
        //do some stuff
        MyAppMethod("hello");
    }
    
  • 如何设置此设置?

    使用事件:

    应用程序A:

    public void MyAppMethod(string inComing){
        Debug.WriteLine("callback returned: " + inComing);
    }
    
    B.MyAppMethod += MyAppMethod;
    
    public void MyAppMethod(string inComing){
        Debug.WriteLine("callback returned: " + inComing);
    }
    
    B.MyAppMethod = MyAppMethod;
    
    附录B:

    public event Action<string> MyAppMethod;
    private void SomeMethod(){
        //do some stuff
        if(MyAppMethod!=null) MyAppMethod("hello");
    }
    
    public Action<string> MyAppMethod;
    private void SomeMethod(){
        //do some stuff
        if(MyAppMethod!=null) MyAppMethod("hello");
    }
    
    附录B:

    public event Action<string> MyAppMethod;
    private void SomeMethod(){
        //do some stuff
        if(MyAppMethod!=null) MyAppMethod("hello");
    }
    
    public Action<string> MyAppMethod;
    private void SomeMethod(){
        //do some stuff
        if(MyAppMethod!=null) MyAppMethod("hello");
    }
    
    公共行动MyAppMethod;
    私有方法(){
    //做点什么
    如果(MyAppMethod!=null)MyAppMethod(“hello”);
    }
    

    这些代码将按原样工作。但是,在使用这个代码之前,你必须考虑很多重要的事情,你会发现

    这是我最后使用的代码。 应用程序A:

    public void MyCallBack(string status)
    {
       // Add callback text to the status window
       StatTxt.AppendText(status);
    }
    
    // Set the callback method in DLL B
    B.HollaBack = MyCallBack;
    
    DLL B:

    public delegate void CallBackDelegate(string status);  
    public CallBackDelegate HollaBack
    {
       get; set;
    }
    
    private void DoCallBack(string inMsg)
    {
       // Make sure the callback method was set
       if (HollaBack != null)
       {
          // send text to the callback method
          HollaBack(inMsg);
       }
    }
    
    // Invoke the callback anywhere within DLL B
    DoCallBack("show this in the status window");
    

    这与使用事件或委托有何不同?我不知道这是什么-这就是为什么我要求帮助如何设置它…它与委托或事件没有什么不同。你可以使用动作委托。这有点太宽泛了。我只是想先读一下c#events。我接受了你的答案,但使用了稍微不同的代码(见下文)。此外,您的学员答案(几乎)与您的事件答案完全相同,因此我认为应该对其进行编辑。@wayneh。谢谢顺便说一句,事件代码和委托代码略有不同。请注意他们的声明(应用程序B的第一行)和消耗量(应用程序A的最后一行)。从技术上讲,event是委托的特例,其operation=无效。这基本上意味着您可以将关键字event更改为delegate,并且每个代码的工作方式应该完全相同。当然,使用委托的概念不同于事件,但它关系到您构建程序的方式。这就是为什么这些例子看起来很像。@wayneh我明白你的意思了。我试图避免使用不必要的
    delegate
    关键字使解决方案过于复杂,因为
    Action
    在99%的情况下已经足够了。请注意,事件不是委托。这是一个常见的误解,尽管它们的语法非常相似other@wayneh使用
    Action
    Func
    还是编写自己的委托,更重要的是美观和品味。但在某些情况下,命名委托会增加可读性。