为什么GetEnumerator在COM中对于从IEnumerable <t>继承的.Net类不可见?</t>

时间:2012-11-28 11:47:26

标签: c# .net com ienumerable

我目前正在尝试在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();
}

1 个答案:

答案 0 :(得分:1)

您不能拥有多个具有相同签名的同名公共方法。因此,使用显式接口实现实现了两个GetEnumerator方法:

IEnumerator ITestIEnumerable.GetEnumerator()
{
}

因此,它们被视为私有成员 - 除非该代码将TestIEnumerable对象强制转换为ITestIEnumerable,否则其他.NET代码甚至无法看到它。

因此,请确定您希望公开哪种GetEnumerator()方法并将其公开:

public IEnumerator GetEnumerator()
{
}

将通用的切换为显式实现:

IEnumerator<Item> IEnumerable<Item>.GetEnumerator()
{
}