COM Interopの汎用コレクションの代替手段は何ですか?
-
06-07-2019 - |
質問
.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クライアントでは正常に機能するようです。