3

我目前正在尝试使 C# API 在 COM 中可见,并且我目前坚持使非泛型GetEnumerator方法在 COM 中对于也继承的类可见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();
}
4

1 回答 1

1

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

IEnumerator ITestIEnumerable.GetEnumerator()
{
}

因此,它们被视为私有成员——它甚至对其他 .NET 代码不可见,除非该代码将您的TestIEnumerable对象转换为ITestIEnumerable.

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

public IEnumerator GetEnumerator()
{
}

并将通用转换为显式实现:

IEnumerator<Item> IEnumerable<Item>.GetEnumerator()
{
}
于 2012-11-28T11:58:09.497 回答