我想有一个库,里面有一个函数,它接受一个对象作为它的参数。
有了这个对象,当X完成时,我希望能够调用指定的函数。将被调用的函数将由调用者指定,X将由库完成和监视。
我该怎么做呢?
作为参考,我使用C#和.NET 3.5
发布于 2009-03-20 20:12:25
为您提供两个选项:
使用委托/lambda
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上使用一个类型参数
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的更多信息。
使用接口
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);
}发布于 2009-03-20 20:05:58
对于委托来说,这听起来是一个完美的方法--特别是,带有委托的回调正是在.NET中异步模式中处理委托的方式。
调用者通常会向你传递一些状态和一个委托,你将它们都存储在你已经获得的任何上下文中,然后调用传递给它状态和任何你可能得到的结果的委托。
您可以将状态设置为object,也可以使用泛型委托并获取适当类型的状态,例如
public delegate void Callback<T>(T state, OperationResult result)然后:
public void DoSomeOperation(int otherParameterForWhateverReason,
Callback<T> callback, T state)当您使用.NET 3.5时,您可能希望使用现有的Func<...>和Action<...>委托类型,但您可能会发现声明自己的委托类型会更清晰。(名称可能会让你更清楚地知道它是做什么用的。)
发布于 2009-03-20 20:03:07
有问题的对象将需要实现您提供的接口。将接口作为参数,然后就可以调用该接口公开的任何方法。否则,您将无法知道对象的功能。或者,您可以将委托作为参数并调用它。
https://stackoverflow.com/questions/667742
复制相似问题