1

我有一个继承的类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,因此是例外。

但是,你如何设置PlainOldPropertyIronPython?正如C#预期的那样,它工作得很好。

我要么错过了什么,要么无法完成。

此外,我尝试覆盖所有其他方法,DynamicObject以查看它们是否被 击中IronPython,但没有雪茄。

任何人都可以解释为什么会这样吗?

4

0 回答 0