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

如何在IronPython中的C#对象上使用特定接口,c#,ironpython,C#,Ironpython,我有一个C#类,它实现了2个IEnumerable接口。如何从IronPython访问任一接口 我的班级: public class MyClass : IEnumerable<TypeA>, IEnumerable<TypeB> { IEnumerator<TypeA> IEnumerable<TypeA>.GetEnumerator() { return _lstTypeA.GetEnumerator();

我有一个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();
    }
}

您需要在使用反射时调用方法和属性(这实际上是在后台发生的)

在您的情况下,您应该:

x = MyClass()
enumerator = IEnumerable[TypeA].GetEnumerator(x)
然后可以循环使用
枚举器

for y in enumerator:
   print y

我不喜欢你的课堂设计。特别是,您实现了两个不同版本的
IEnumerable
,它们返回不同的成员。返回相同成员的两个版本稍微好一点,但我还是不太喜欢

  • 实现
    IEnumerable
    ,使其与
    IEnumerable
    保持一致在这里是不可能的。特别是,它打破了type和Castlinq方法的
  • 您几乎到处都会遇到过载解决问题。像
    Select(this IEnumerable…
    这样的方法不知道使用哪个
    IEnumerable
  • 您不能在
    MyClass

  • 如果
    TypeA
    TypeB
    都是参考类型,那么
    IEnumerable
    的变化会反过来影响你。因为它们都提供了
    IEnumerable如何使用指定的接口

    clr.AddReference('Platform.CardHost')
    from Platform import CardHost
    from Platform.CardHost import ICardHost
    
    host = CardHost.CardHost.CreateInstance('session')
    # ICardHost is interface
    # inside C# 
    # public interface ICardHost {
    # IExtensionManager ExtensionManager { get; }
    em = ICardHost.ExtensionManager.__get__(host) 
    


    多么糟糕的课程设计。。。试着说服作者他应该修复它。@CodeInChaos:我就是作者。请解释为什么这个设计很糟糕,这样我可以改进它。我猜他的意思是,当一个类实现两个不同的
    IEnumerable
    时,这不是一个好的设计,因为要隐式实现
    GetEnumerator()
    ,你需要一个cast(顺便说一句,为什么一个类表示两个不同元素的集合…)。可能最好将两个
    IEnumerable
    s中的一个(不太重要,或者两者都不重要)作为该类的属性公开。一旦看到它,就会很明显。。。工作完美。非常感谢。链接似乎已断开。好吧,我明白为什么MyClass会被视为邪恶。您建议使用两个可枚举属性是一个值得欢迎的改进。非常感谢。
    public class MyClass
    {
      public IEnumerable<TypeA> TypeAs{get{_lstTypeA.Select(x=>x)}};
      public IEnumerable<TypeB> TypeBs{get{_lstTypeB.Select(x=>x)}};
    }
    
    clr.AddReference('Platform.CardHost')
    from Platform import CardHost
    from Platform.CardHost import ICardHost
    
    host = CardHost.CardHost.CreateInstance('session')
    # ICardHost is interface
    # inside C# 
    # public interface ICardHost {
    # IExtensionManager ExtensionManager { get; }
    em = ICardHost.ExtensionManager.__get__(host)