如何在IronPython中使用C#对象上的特定接口

Han*_*Han 2 c# ironpython

我有一个C#类,它实现了2个IEnumerable接口.如何从IronPython访问任一界面?

我的课:

public class MyClass : IEnumerable<TypeA>, IEnumerable<TypeB>
{
    IEnumerator<TypeA> IEnumerable<TypeA>.GetEnumerator()
    {
        return _lstTypeA.GetEnumerator();
    }

    IEnumerator<TypeB> IEnumerable<TypeB>.GetEnumerator()
    {
        return _lstTypeB.GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在Python中尝试了以下内容,但它运行时没有错误,它不会从IEnumerable接口返回任何元素:

x = MyClass()
xA = clr.Convert(x, IEnumerable[TypeA])
for y in xA: print y
Run Code Online (Sandbox Code Playgroud)

Cod*_*aos 5

我不喜欢你的课堂设计.特别是您实现了两个不同版本的IEnumerable<T>返回不同成员.返回相同成员的两个版本稍好一些,但我仍然不喜欢那么多.

  1. 实现IEnumerable所以它与IEnumerable<T>s 两者一致是不可能的.特别是打破了OfTypeCastlinq方法.
  2. 你几乎到处都会遇到过载解决问题.方法就像Select<T>(this IEnumerable<T> ...)不知道IEnumerable采取哪种方法.
  3. 您不能使用foreachMyClass
  4. 如果这两个TypeATypeB是引用类型的差异IEnumerable<out T>回来咬你.因为他们都提供他们IEnumerable<T'>所有共同的祖先.
  5. 它与动态类型语言不能很好地交互
  6. 同时作为两个不同集合的类很少有意义.它通常表示从概念到类的映射出了问题.
  7. 这令人困惑,难以理解.我的直觉告诉我它是邪恶的,我应该用火烧它:P

还有几个我还没有想到的问题.


解决方法简单而干净:有两个独立的可枚举属性.

public class MyClass
{
  public IEnumerable<TypeA> TypeAs{get{_lstTypeA.Select(x=>x)}};
  public IEnumerable<TypeB> TypeBs{get{_lstTypeB.Select(x=>x)}};
}
Run Code Online (Sandbox Code Playgroud)