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

2024-03-29

我有一个实现 2 个 IEnumerable 接口的 C# 类。如何从 IronPython 访问任一界面?

我的课:

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

    IEnumerator<TypeB> IEnumerable<TypeB>.GetEnumerator()
    {
        return _lstTypeB.GetEnumerator();
    }
}

我在 Python 中尝试了以下操作,但尽管它运行没有错误,但它没有从 IEnumerable 接口返回任何元素:

x = MyClass()
xA = clr.Convert(x, IEnumerable[TypeA])
for y in xA: print y

我不喜欢你的班级设计。特别是您实现了两个不同版本的IEnumerable<T>返回不同的成员。返回相同成员的两个版本稍好一些,但我仍然不太喜欢。

  1. 实施IEnumerable所以两者都是一致的IEnumerable<T>这里不可能。特别是打破了OfType and Castlinq 方法。
  2. 几乎到处都会遇到重载解决问题。方法如Select<T>(this IEnumerable<T> ...)不知道哪个IEnumerable采取。
  3. 你不能使用foreach on MyClass
  4. If both TypeA and TypeB是参考类型的方差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)}};
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 IronPython 中使用 C# 对象的特定接口 的相关文章

随机推荐