C# 获取匿名方法的目标

C# 获取匿名方法的目标,c#,.net,delegates,anonymous-methods,anonymous-delegates,C#,.net,Delegates,Anonymous Methods,Anonymous Delegates,以下方法是基类的一部分,它使派生类能够指定事件应通知的对象 protectedvoid-RaiseEvent(EventHandler-updateEvent、TEventArgs-eventArgs、UpdateReceivers-UpdateReceivers) 其中TEventArgs:EventArgs { EventHandler=updateEvent; if(处理程序!=null) { if(updateReceivers.ToAllSubscribers) { 处理程序(此,ev

以下方法是基类的一部分,它使派生类能够指定事件应通知的对象

protectedvoid-RaiseEvent(EventHandler-updateEvent、TEventArgs-eventArgs、UpdateReceivers-UpdateReceivers)
其中TEventArgs:EventArgs
{
EventHandler=updateEvent;
if(处理程序!=null)
{
if(updateReceivers.ToAllSubscribers)
{
处理程序(此,eventArgs);
}
其他的
{
NotifySpecifiedReceiver(处理程序、eventArgs、updateReceivers.Receiver);
}
}
}
私有void NotifySpecifiedReceiver(EventHandler处理程序、TevenTargets eventArgs、object updateReceiver)
其中TEventArgs:EventArgs
{
foreach(handler.GetInvocationList()中的Delegate@Delegate)
{
//代表们的目标是我们的接受者吗?
//但这不适用于匿名方法:(
如果(@delegate.Target==updateReceiver)
{
尝试
{
@delegate.DynamicInvoke(this,eventArgs);
}
捕获(例外情况除外)
{
}
}
}
}
为了只通知一个特定的接收者,该方法是这样使用的:(当然,接收者必须被订阅)

事件事件处理程序发生了一些变化;
RaiseEvent(SomethingChanged、args、UpdateReceivers.Single(receiver));
这只会使学员“指向”接收器

这里的问题是,当我使用匿名方法订阅SomethingChanged事件时,当我使用此事件通知订阅它的对象时,它不起作用

类事件消费者
{
私有事件源_EventSource;
私有无效订阅事件()
{
//由于检查[@delegate.Target==updateReceiver]不适用于匿名方法,因此不会调用ReactOneEvent()
_eventSource.MyStateChanged+=(发送方,e)=>reactionEvent();
_eventSource.PublishCurrentState(此);
}
}
类事件源
{
//此事件订阅了多个对象
事件处理程序MyStateChanged;
公共无效GetCurrentState(对象接收器)
{
//接收者询问当前状态,仅为他引发事件
RaiseEvent(MyStateChanged、args、UpdateReceivers.Single(receiver));
}
}
是否可能获取包含匿名方法的实例?或者我是否应该使用完全不同的方法来解决我的问题?

您(大概)看到的是包含匿名方法使用的变量的实例。
此类具有来自父类的引用信息

您可以使用反射在编译器生成的名为
4\u this
DisplayClass
(目标值)中查找字段,并获取其值以查找创建委托的类的实例

但是,不要这样做
这取决于C#编译器的内部行为,该行为可能随时发生变化

此外,闭包类包含的字段取决于匿名方法所在的位置及其引用的成员。如果匿名方法不使用类实例,则可能根本没有
字段。

您(可能)看到的是包含匿名方法使用的变量的字段。
此类具有来自父类的引用信息

您可以使用反射在编译器生成的名为
4\u this
DisplayClass
(目标值)中查找字段,并获取其值以查找创建委托的类的实例

但是,不要这样做
这取决于C#编译器的内部行为,该行为可能随时发生变化


此外,闭包类包含的字段取决于匿名方法所在的位置及其引用的成员。如果匿名方法不使用类实例,则可能根本没有
字段。

您不应该调用
DynamicInvoke
。是否有其他方法调用委托?
@delegate(this,eventArgs)
对于非类型委托,您只需要
DynamicInvoke
。(它使用反射调用方法)@delegate(this,eventArgs)导致编译器错误->“委托”是一个“变量”,但像“方法”一样使用。您需要将其声明为
EventHandler
您不应该调用
DynamicInvoke
。是否有其他方法调用委托?
@delegate(this,eventArgs)
对于非类型委托,您只需要
DynamicInvoke
。(它使用反射来调用方法)@delegate(this,eventArgs)导致编译器错误->“委托”是一个“变量”,但像“方法”一样使用。您需要将其声明为
EventHandler
好的,我想我必须接受这样一个事实:在这里不可能使用匿名方法。有没有办法在不使用反射的情况下确定委托是否是匿名方法?这会很有帮助当某人使用匿名方法订阅时添加日志项。检查
目标是否为
[CompilerGenerated]
。好的,我想我必须接受这样一个事实:在这里不可能使用匿名方法。有没有办法在不使用反射的情况下确定委托是否是匿名方法?如果有人使用匿名方法订阅,添加日志条目会很有帮助。请检查
目标是否为
[编译器生成]