c# - 谁将 BeginInvoke、Invoke 和 EndInvoke 方法定义添加到类型化委托(delegate)中?

标签 c# delegates

例如如果你写...
public delegate void MyTypedDel(int x)
Intellisense 显示 BeginInvoke、Invoke 和 EndInvoke 是 MyTypedDel 类型定义的一部分。
它们不是 Delegate 或 MulticastDelegate 类型定义的一部分。 (委托(delegate)有一个 DynamicInvoke 方法,它使用后期/运行时绑定(bind)来绑定(bind)到一个方法。)

所以我的问题是这些方法在哪里混合到类型化委托(delegate)类型定义中,它的实现是什么样的?我读到... Invoke 在同一线程上连续内部调用 BeginInvoke 和 EndInvoke。这是真的吗?

只是好奇这里的引擎盖下的魔法..也许我错过了一些非常明显的东西......在这种情况下是残酷的:)

最佳答案

编译器生成您的委托(delegate)类,它扩展了 Delegate BCL 类并添加了特定于您的委托(delegate)签名的方法。您可以通过在反射器中查看您的委托(delegate)(或 BCL 委托(delegate))并切换到 IL View 来看到这一点(因为 C# 反汇编器足够智能,可以将其转回委托(delegate)声明)。示例:

.class public auto ansi sealed WaitCallback
    extends System.MulticastDelegate
{
    .custom instance void System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = { bool(true) }
    .method public hidebysig specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed
    {
    }

    .method public hidebysig newslot virtual instance class System.IAsyncResult BeginInvoke(object state, class System.AsyncCallback callback, object 'object') runtime managed
    {
    }

    .method public hidebysig newslot virtual instance void EndInvoke(class System.IAsyncResult result) runtime managed
    {
    }

    .method public hidebysig newslot virtual instance void Invoke(object state) runtime managed
    {
    }

}

关于c# - 谁将 BeginInvoke、Invoke 和 EndInvoke 方法定义添加到类型化委托(delegate)中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/680828/

相关文章:

iphone - NSURLConnection didFailWithError 未调用?

ios - 弱委托(delegate)变为零

c# - 比较日期我为空的日期

C# - 位和字节

c# - IOS批量推送通知

iOS Swift : Closures (Callbacks) versus Delegates, 什么时候使用哪个?

c# - 为什么在 C# 中不允许部分委托(delegate)?

c# - 如何使用 WP7 Panorama & Pivot Controls 在 Windows Phone 7 中选择特定的 PivotItem?

c# - 在 C# 中使用列表

c# - 通用委托(delegate) C#