首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#中的回调

C#中的回调
EN

Stack Overflow用户
提问于 2009-03-20 20:01:22
回答 5查看 41K关注 0票数 17

我想有一个库,里面有一个函数,它接受一个对象作为它的参数。

有了这个对象,当X完成时,我希望能够调用指定的函数。将被调用的函数将由调用者指定,X将由库完成和监视。

我该怎么做呢?

作为参考,我使用C#和.NET 3.5

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-03-20 20:12:25

为您提供两个选项:

  1. 让函数接受delegate (Action表示不返回任何内容的回调,Func表示返回任何内容的回调),并在调用时使用匿名委托或Lambda表达式。
  2. 使用接口

使用委托/lambda

代码语言:javascript
运行
复制
public static void DoWork(Action processAction)
{
  // do work
  if (processAction != null)
    processAction();
}

public static void Main()
{
  // using anonymous delegate
  DoWork(delegate() { Console.WriteLine("Completed"); });

  // using Lambda
  DoWork(() => Console.WriteLine("Completed"));
}

如果你的回调需要传递一些东西给它,你可以在Action上使用一个类型参数

代码语言:javascript
运行
复制
public static void DoWork(Action<string> processAction)
{
  // do work
  if (processAction != null)
    processAction("this is the string");
}

public static void Main()
{
  // using anonymous delegate
  DoWork(delegate(string str) { Console.WriteLine(str); });

  // using Lambda
  DoWork((str) => Console.WriteLine(str));
}

如果它需要多个参数,您可以向Action添加更多类型参数。如果需要返回类型,请如前所述使用Func,并将返回类型作为最后一个类型参数(Func<string, int>是一个接受字符串并返回整数的函数。)

有关委派here的更多信息。

使用接口

代码语言:javascript
运行
复制
public interface IObjectWithX
{
  void X();
}

public class MyObjectWithX : IObjectWithX
{
  public void X()
  {
    // do something
  }
}

public class ActionClass
{
  public static void DoWork(IObjectWithX handlerObject)
  {
    // do work
    handlerObject.X();
  }
}

public static void Main()
{
  var obj = new MyObjectWithX()
  ActionClass.DoWork(obj);
}
票数 41
EN

Stack Overflow用户

发布于 2009-03-20 20:05:58

对于委托来说,这听起来是一个完美的方法--特别是,带有委托的回调正是在.NET中异步模式中处理委托的方式。

调用者通常会向你传递一些状态和一个委托,你将它们都存储在你已经获得的任何上下文中,然后调用传递给它状态和任何你可能得到的结果的委托。

您可以将状态设置为object,也可以使用泛型委托并获取适当类型的状态,例如

代码语言:javascript
运行
复制
public delegate void Callback<T>(T state, OperationResult result)

然后:

代码语言:javascript
运行
复制
public void DoSomeOperation(int otherParameterForWhateverReason,
                            Callback<T> callback, T state)

当您使用.NET 3.5时,您可能希望使用现有的Func<...>Action<...>委托类型,但您可能会发现声明自己的委托类型会更清晰。(名称可能会让你更清楚地知道它是做什么用的。)

票数 6
EN

Stack Overflow用户

发布于 2009-03-20 20:03:07

有问题的对象将需要实现您提供的接口。将接口作为参数,然后就可以调用该接口公开的任何方法。否则,您将无法知道对象的功能。或者,您可以将委托作为参数并调用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/667742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档