问题描述
我想实现一个通用的包装级使用C#的DynamicObject Qt的等级制度。不过,我想写以下code:
I am trying to implement a generic Wrapper-Class for Qt's class system using C#'s DynamicObject. However, I want to write the following code:
dynamic obj = new SomeWrapperClass(....); // This extends DynamicObject
obj.OnMyEvent += (Action)(() => Console.WriteLine("DO something!"));
以上是有效的code根据VS2010(显式强制转换为行动是必需的),但究竟如何做我抓使用DynamicObject的方法,这种说法?
The above is valid code according to VS2010 (the explicit cast to Action is required), but how exactly do i "catch" that statement using DynamicObject's methods?
我想实现TryGetMember(),它被调用的语句,但我不知道我要回到使其工作。
I tried implementing TryGetMember() and it gets called for the statement, but I have no idea what I have to return to make it work.
任何提示?
推荐答案
反射是你的朋友在这一个。关于你的第二线所产生的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();
}
}
这篇关于我怎样才能实现与DynamicObject事件acessors在C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!