gpt4 book ai didi

C# 反射 : How to invoke a EventInfo?

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:36 25 4
gpt4 key购买 nike

我如何调用 EventInfo 背后的事件?我尝试了以下但“GetRaiseMethod”始终为“null”:

MethodInfo eventRaiseMethod = eventInfos[i].GetRaiseMethod();
eventRaiseMethod.Invoke(this, arrayOfPropertyChangedArgs);

谢谢你:)

更新:这似乎是 C# 中的错误???

EventInfo.GetRaiseMethod() always null

最佳答案

“调用”事件只有在没有覆盖添加\删除的情况下实现事件才有意义:

class Test {
public event Action TestEvent;

void Invoke() {
// fine
TestEvent();
}
}

但是,使用自定义添加\删除调用事件的概念没有意义:

class Test {
public event Action TestEvent
{
add { }
remove { }
}

void Invoke() {
// does not compile, invoke what?
TestEvent();
}
}

因此,对于具有“默认”实现的事件,事件调用只是调用底层编译器生成的委托(delegate)字段的语法糖。

知道这一点后,您可以搜索该字段并调用它。这是一个与事件同名的私有(private)字段:

class Program {
static void Main(string[] args) {
var test = new Test();
test.TestEvent += OnTest;
var backingField = typeof(Test).GetField("TestEvent", BindingFlags.Instance | BindingFlags.NonPublic);
var delegateInstance = (Action)backingField.GetValue(test);
delegateInstance();
}

private static void OnTest() {
Console.WriteLine("Event invoked");
}
}

class Test {
public event Action TestEvent;
}

也就是说,某些 .NET 语言的编译器可能会为自动实现的事件生成“Raise”方法。如果是这种情况 - GetRaiseMethod 将返回此类方法。 C# 编译器不会那样做。因此,如果您想安全起见 - 您可以先调用 GetRaiseEvent,如果它返回 null - 则回退到现场方法。当然,您应该期望字段也为空(因为并非所有事件都如上所述可调用 - 不需要存在此类字段)。

关于C# 反射 : How to invoke a EventInfo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49549568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com