如何在IronPython中的C#对象上使用特定接口
我有一个C#类,它实现了2个IEnumerable接口。如何从IronPython访问任一接口 我的班级:如何在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();
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)