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);
    }
}

最初のテストはパスしますが、2 番目のテストは失敗します。

System.MissingMemberException : 'Foo' オブジェクトに属性 'PlainOldProperty' がありません

これは、 で何が起こっているかによるものTrySetMember()です。設定しようとしているメンバーがまだ辞書に含まれていない場合、ジョブはDynamicObjectのバージョンのに委任されTrySetMember()ます。結局のところ、これは を返すfalseため、例外です。

しかし、それでは、どのように から設定PlainOldPropertyIronPythonますか? 期待どおり、C#それはうまく機能します。

私は何かが欠けているか、それを行うことができません。

さらに、他のすべてのメソッドをオーバーライドして、葉巻がDynamicObjectヒットしていないかどうかを確認しようとしました。IronPython

なぜこれが起こるのか、誰かが光を当てることができますか?

4

0 に答える 0