コレクションでは、DispID が重要です。

要素の取得はゼロ、カウントは1、列挙は -4 です。

それ以外は注意するところはありません。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Runtime.InteropServices;

namespace OracleInProcServerForVBS
{

    [ComVisible(true)]
    [Guid(OraFields.InterfaceId)]
    public interface IOraFields 
    {
        [DispId(0)]
        OraField this[object Index] { get; }

        [DispId(1)]
        int Count { get; }

        [DispId(-4)]
        IEnumerator GetEnumerator();
    }


    [ComVisible(true)]
    [Guid(OraFields.ClassId)]
    [ClassInterface(ClassInterfaceType.None)]
    public class OraFields : IOraFields, IEnumerable
    {
        public const string ClassId = "37F7B475-A488-4B59-BB30-05537ABAF87A";
        public const string InterfaceId = "7EF32593-7E9F-45EE-9D2C-551FD3B2EDDF";

        int m_Count;
        DataColumnCollection m_DataColumns;
        Dictionary<DataColumn, OraField> m_Dictionary;

        internal OraFields(OraDynasetClass dyn, DataColumnCollection dcc) {
            m_Count = dcc.Count;
            m_DataColumns = dcc;
            m_Dictionary = new Dictionary<DataColumn, OraField>();
            for (int i = 0; i < m_Count; i++) {
                DataColumn dc = dcc[i];
                OraField f = new OraField(dyn, dc.ColumnName, dc);
                m_Dictionary.Add(dc, f);
            }
        }

        [DispId(0)]
        public OraField this[object Index] {
            get {
                var name = Index as string;
                DataColumn dc;
                if (name != null) {
                    dc = m_DataColumns[name];
                } else {
                    dc = m_DataColumns[Convert.ToInt32(Index)];
                }
                return m_Dictionary[dc];
            }
        }

        [DispId(1)]
        public int Count {
            get { 
                return m_Count; 
            }
        }

        [DispId(-4)]
        public IEnumerator GetEnumerator() {
            foreach (OraField f in m_Dictionary.Values) {
                yield return f;
            }
        }

    }
}



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2020-04-14 (火) 16:10:02 (42d)