我有一个继承的类DynamicObject
,我需要通过IronPython
. 我可以毫无问题地访问动态属性,但普通的旧属性不起作用。
这是我的对象的一个稍微简化的实现:
class Foo : DynamicObject
{
Dictionary<string, object> _dynamicMembers = new Dictionary<string, object>();
public Foo()
{
_dynamicMembers.Add("dynamicProperty", 0);
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return _dynamicMembers.TryGetValue(binder.Name, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (_dynamicMembers.ContainsKey(binder.Name))
{
_dynamicMembers[binder.Name] = value;
return true;
}
return base.TrySetMember(binder, value);
}
public string PlainOldProperty { get; set; }
}
这是一个NUnit
演示问题的测试用例:
[TestFixture]
public class FooTest
{
[Test]
public void CanSetDynamicProperty()
{
var engine = IronPython.Hosting.Python.CreateEngine();
var scope = engine.CreateScope();
dynamic foo = new Foo();
scope.SetVariable("foo", foo);
engine.Execute("foo.dynamicProperty = 1", scope);
Assert.AreEqual(1, foo.dynamicProperty);
}
[Test]
public void CanSetPlainOldProperty()
{
var engine = IronPython.Hosting.Python.CreateEngine();
var scope = engine.CreateScope();
dynamic foo = new Foo();
scope.SetVariable("foo", foo);
engine.Execute("foo.PlainOldProperty = 1", scope);
Assert.AreEqual(1, foo.PlainOldProperty);
}
}
第一个测试通过,但第二个没有,因为它抛出:
System.MissingMemberException:“Foo”对象没有属性“PlainOldProperty”
这是因为发生了什么TrySetMember()
:如果我们试图设置的成员尚未包含在字典中,它会将作业委托给DynamicObject
的版本TrySetMember()
。事实证明,它返回false
,因此是例外。
但是,你如何设置PlainOldProperty
从IronPython
?正如C#
预期的那样,它工作得很好。
我要么错过了什么,要么无法完成。
此外,我尝试覆盖所有其他方法,DynamicObject
以查看它们是否被 击中IronPython
,但没有雪茄。
任何人都可以解释为什么会这样吗?