IronPython重写__setattr__和__getattr__

时间:2010-04-01 22:41:35

标签: c# ironpython dynamic-language-runtime

我正在尝试使用拦截Python __setattr__和__getattr__魔术方法的方法在C#中实现一个类。我发现了这个错误报告:

http://ironpython.codeplex.com/WorkItem/View.aspx?WorkItemId=8143

但那是从2008年开始,我无处可寻找ICustomAttributes或PythonNameAttribute。我在Interfaces.cs中看不到任何有用的东西。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:4)

我不使用IronPython,所以我可能完全错了,但这是我想的。

鉴于动态语言运行时现已完全集成在.NET 4.0中,而IronPython基于DLR,您应该能够使用标准.NET方式创建处理非现有成员/属性/的设置/获取的对象属性。这可以通过实现IDynamicMetaObjectProvider接口来完成。一种更简单的方法是从DynamicObject继承,它为大多数方法提供默认实现,并只添加您需要的方法(参见members of DynamicObject):

class MyObject : DynamicObject {
  public override bool TryGetMember
      (GetMemberBinder binder, out object result) {
    string name = binder.Name;
    // set the 'result' parameter to the result of the call
    return // true to pretend that attribute called 'name' exists
  }

  public override bool TrySetMember
      (SetMemberBinder binder, object value) {
    // similar to 'TryGetMember'
  }  
}

在C#中,由于dynamic,您可以使用此对象。 IronPython应该以同样的方式对待它!