更新时间:2022-05-16 00:37:20
反射是你的朋友在这一个。关于你的第二线所产生的code看起来是这样的(大约):
Reflector is your friend on this one. The code generated for your second line looks something like this (approximately):
if(Binder.IsEvent("OnMyEvent", typeof(SomeWrapperClass)))
{
Binder.InvokeMember("add_OnMyEvent", obj, myAction);
}
else
{
var e = Binder.GetMember("OnMyEvent", obj);
var ae = Binder.BinaryOperation(ExpressionType.AddAssign, e, myAction);
Binder.SetMember("OnMyEvent", obj, ae);
}
如果您不能使用 OnMyEvent
真实的事件(在这种情况下,你可以在默认瘦 DynamicObject
实现),那么你就需要返回的东西,它实现中用addAssign
返回像多播委托。我建议前,如果可能的话...
If you can't use a real event for OnMyEvent
(in which case you can lean on the default DynamicObject
implementation), then you'll need to return something that implements AddAssign
returning something like a multicast delegate. I'd suggest the former, if possible...
有关的乐趣,这里有一个hackish的例子,动态结合OnMyEvent到OnMyOtherEvent:
For fun, here's a hackish example that dynamically binds OnMyEvent to OnMyOtherEvent:
public class SomeWrapperClass : DynamicObject
{
public event Action OnMyOtherEvent;
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
if (binder.Name == "OnMyEvent")
{
result = OnMyOtherEvent;
return true;
}
return base.TryGetMember(binder, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (binder.Name == "OnMyEvent" && value is Action)
{
OnMyOtherEvent = (Action)value;
return true;
}
return TrySetMember(binder, value);
}
public void Test()
{
if (OnMyOtherEvent != null)
OnMyOtherEvent();
}
private static void TestEventHandling()
{
dynamic obj = new SomeWrapperClass(); // This extends DynamicObject
obj.OnMyEvent += (Action)(() => Console.WriteLine("DO something!"));
obj.Test();
}
}