如何在调用方法内部定义回调函数

本文关键字:定义 回调 函数 内部 方法 调用 | 更新日期: 2023-09-27 18:22:35

我想在调用方法内部声明/定义我的委托和回调函数。这可能吗?如果是,如何?这是我的代码,我想在上执行我的第一次植入操作

delegate bool myDelegate(IntPtr module, string type, IntPtr lParam);
public static bool EnumResTypeProc(IntPtr module, string typename, IntPtr lParam)
{
    (((GCHandle) lParam).Target as List<string>).Add(typename);
    return true;
}
public static string[] getResourceTypes(IntPtr module)
{
    List<string> result = new List<string>();
    GCHandle pin = GCHandle.Alloc(result);
    WinApi.EnumResourceTypes(module, Marshal.GetFunctionPointerForDelegate(new myDelegate(EnumResTypeProc)), (IntPtr)pin);
    pin.Free();
    return result.ToArray();
}


我得到的最接近的:

delegate bool myDelegate(IntPtr module, string type, IntPtr lParam);
public static string[] getResourceTypes(IntPtr module)
{
    List<string> result = new List<string>();
    GCHandle pin = GCHandle.Alloc(result);
    myDelegate d = delegate(IntPtr handle, string typename, IntPtr lParam)
        { (((GCHandle) lParam).Target as List<string>).Add(typename); return true; };
    WinApi.EnumResourceTypes(module, Marshal.GetFunctionPointerForDelegate(d), (IntPtr) pin);
    pin.Free();
    return result.ToArray();
}


此时不可能在方法内部声明委托。即使经过编译,它也会导致非托管代码使我的应用程序崩溃。

如何在调用方法内部定义回调函数

是的,您可以使用匿名方法lambda表达式

// untested
Func<IntPtr, string, IntPtr, bool> inline = (module, typename, lParam) =>
{
    (((GCHandle)lParam).Target as List<string>).Add(typename);
    return true;
};
WinApi.EnumResourceTypes(module, Marshal.GetFunctionPointerForDelegate(inline), (IntPtr)pin);

尝试使用以下链接:

微软支持

如何在C#和.NET 中编写回调

或者我的例子:

public delegate void AsyncMethodCaller(strind inputdata);

 void someMethod()
{
//
// ... some actions 
//
AsyncMethodCaller caller = new AsyncMethodCaller(this.ProcessInputData);
   // Initiate the asychronous call.
   IAsyncResult result = caller.BeginInvoke("my data");
}
void ProcessInputData(string inputData)
{
    // some actions
}