我目前正在尝试在COM中显示一个C#API,而我目前仍然坚持在COM中为可继承GetEnumerator
的类显示非通用IEnumerable<T>
方法。如果我在ITestIEnumerable
上实现另一种方法,则可见。我还发现非通用GetEnumerator
方法在从列表派生的类中是可见的。
我真的不明白为什么这不起作用,对于继承IEnumerable<T>
的类来说似乎是一种特殊情况。反正有没有把它暴露给COM所以我可以在VB6中使用For Each构造?
例如
[ClassInterface(ClassInterfaceType.AutoDual)]
[ProgId("Test")]
[Guid("1aa2bdec-0530-44e8-b62d-b75914a6de22")]
public class TestIEnumerable : ITestIEnumerable
{
#region IEnumerable<Item> Members
[ComVisible(false)]
public IEnumerator<Item> GetEnumerator()
{
return _collection.GetEnumerator();
}
#endregion
#region ITestIEnumerable Members
[DispId(-4)]
[ComVisible(true)]
IEnumerator ITestIEnumerable.GetEnumerator()
{
return _collection.GetEnumerator();
}
#endregion
#region IEnumerable Members
[DispId(-4)]
[ComVisible(true)]
IEnumerator IEnumerable.GetEnumerator()
{
return _collection.GetEnumerator();
}
#endregion
}
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("187f3fed-9d4a-4a52-9a7c-a2fdeb56b9fa")]
[ComImport]
public interface ITestIEnumerable : IEnumerable<Item>
{
[DispId(-4)]
[ComVisible(true)]
new IEnumerator GetEnumerator();
}
答案 0 :(得分:1)
您不能拥有多个具有相同签名的同名公共方法。因此,使用显式接口实现实现了两个GetEnumerator
方法:
IEnumerator ITestIEnumerable.GetEnumerator()
{
}
因此,它们被视为私有成员 - 除非该代码将TestIEnumerable
对象强制转换为ITestIEnumerable
,否则其他.NET代码甚至无法看到它。
因此,请确定您希望公开哪种GetEnumerator()
方法并将其公开:
public IEnumerator GetEnumerator()
{
}
将通用的切换为显式实现:
IEnumerator<Item> IEnumerable<Item>.GetEnumerator()
{
}