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ため、例外です。
しかし、それでは、どのように から設定PlainOldPropertyしIronPythonますか? 期待どおり、C#それはうまく機能します。
私は何かが欠けているか、それを行うことができません。
さらに、他のすべてのメソッドをオーバーライドして、葉巻がDynamicObjectヒットしていないかどうかを確認しようとしました。IronPython
なぜこれが起こるのか、誰かが光を当てることができますか?