質問

.NETアセンブリから部門のコレクションを返して、COM相互運用機能を介してASPで使用しようとしています。 .NETを使用すると、ジェネリックコレクションを返すだけです。 List<Department>しかし、ジェネリックはCOM Interopではうまく機能しないようです。だから、私のオプションは何ですか?

リストを繰り返し処理し、インデックスでアイテムにアクセスできるようにしたいと思います。 IListを継承する必要がありますか、IList<Department>List[index]または別のインターフェイスを実装する必要がありますか、それともより良い方法がありますか?理想的には、必要なすべてのタイプのリストにカスタムコレクションを実装する必要はありません。また、<=> COM Interopでも動作しますか?

ありがとう、 マイク

.NETコンポーネントの例(C#):

public class Department {
    public string Code { get; private set; }
    public string Name { get; private set; }
    // ...
}

public class MyLibrary {
    public List<Department> GetDepartments() {
        // return a list of Departments from the database
    }
}

ASPコードの例:

<%
Function PrintDepartments(departments)
    Dim department
    For Each department In departments
        Response.Write(department.Code & ": " & department.Name & "<br />")
    Next
End Function

Dim myLibrary, departments
Set myLibrary = Server.CreateObject("MyAssembly.MyLibrary")
Set departments = myLibrary.GetDepartments()
%>
<h1>Departments</h1>
<% Call PrintDepartments(departments) %>
<h1>The third department</h1>
<%= departments(2).Name %>

関連する質問:

役に立ちましたか?

解決

さらに調査と試行錯誤を重ねた結果、System.Collections.ArrayListを使用して解決策を見つけたと思います。ただし、これはインデックスによる値の取得では機能しません。そのために、ComArrayListを継承する新しいクラスArrayListを作成し、新しいメソッドGetByIndexおよびSetByIndexを追加します。

COM相互運用互換コレクション:

public class ComArrayList : System.Collections.ArrayList {
    public virtual object GetByIndex(int index) {
        return base[index];
    }

    public virtual void SetByIndex(int index, object value) {
        base[index] = value;
    }
}

更新された.NETコンポーネントMyLibrary.GetDepartments:

public ComArrayList GetDepartments() {
    // return a list of Departments from the database
}

更新されたASP:

<h1>The third department</h1>
<%= departments.GetByIndex(2).Name %>

他のヒント

ASPでデータを消費するだけなので、Department[]を返すことをお勧めします。これは、COMのSAFEARRAYに直接マップする必要があります。列挙とインデックス付きアクセスもサポートしています。

public Department[] GetDepartments() {
    var departments = new List<Department>();
    // populate list from database
    return departments.ToArray();
}

ASPコードで、これを実行できませんか?

<h1>The third department</h1>
<%= departments.Item(2).Name %>

VB .NETでは、C#インデクサーが<!> quot; Item <!> quot;を介してサポートされていることを知っています。プロパティ。したがって、同じアイデアがASPで機能する可能性があります。

vb.netでこの同じ問題に対処しようとしました(C#に堪能ではありません)。

List(Of T)はIListインターフェイスをサポートしているので、指定したオブジェクトのCOMインターフェイスに対して

Public Class MyClass
...
   Private _MyList As List(of MyObject)
   Public ReadOnly Property MyList As IList Implements IMyClass.MyList
    Get
        Return _MyList
    End Get
   End Property

そしてCOMが見るパブリックインターフェイスで指定

ReadOnly Property MyList As IList

これは、オブジェクトをインスタンス化し、ジェネレーター関数を呼び出し、MyListプロパティを配列のように読み取る従来のASPクライアントでは正常に機能するようです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top