3

私は現在、C# API を COM で表示できるようにしようとしていますが、現在、GetEnumerator継承も継承するクラスの非ジェネリック メソッドを COM で表示することに固執していIEnumerable<T>ます。に別のメソッドを実装するとITestIEnumerable、それが表示されます。GetEnumeratorリストから派生したクラスでは、非ジェネリック メソッドが表示されることもわかりました。

これが機能しない理由がよくわかりません。継承するクラスの特殊なケースのようですIEnumerable<T>。VB6 で For Each コンストラクトを使用できるように、これを COM に公開する方法はありますか?

例えば

[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

同じシグネチャを持つ同じ名前のパブリック メソッドを複数持つことはできません。そのため、2 つのGetEnumeratorメソッドが明示的なインターフェイスの実装を使用して実装されています。

IEnumerator ITestIEnumerable.GetEnumerator()
{
}

TestIEnumerableそのため、それらはプライベート メンバーとして扱われます。コードがオブジェクトを にキャストしない限り、他の .NET コードからは見えませんITestIEnumerable

したがって、どのGetEnumerator()メソッドを公開するかを決定し、公開します。

public IEnumerator GetEnumerator()
{
}

そして、一般的なものを明示的な実装に切り替えます。

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