C# 如何将回调方法传递给C中的另一个类#
我使用的是C#,我创建了一个应用程序A和一个动态链接库B。 我希望能够做到以下几点: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(
public void MyAppMethod(string inComing){
Debug.WriteLine("callback returned: " + inComing);
}
B.SetCallback(MyAppMethod)代码>
private void SomeMethod(){
//do some stuff
MyAppMethod("hello");
}
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
还是编写自己的委托,更重要的是美观和品味。但在某些情况下,命名委托会增加可读性。