11

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

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

ありがとう、マイク

.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 %>

関連する質問:

4

4 に答える 4

12

さらに調査と試行錯誤を重ねた結果、 を使用して解決策を見つけたと思います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 %>
于 2008-11-06T19:53:20.453 に答える
5

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

public Department[] GetDepartments() {
    var departments = new List<Department>();
    // populate list from database
    return departments.ToArray();
}
于 2009-12-07T15:07:33.007 に答える
1

私は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 クライアントからは正常に機能するようです。

于 2012-02-20T14:35:44.203 に答える
1

あなたの ASP コードでは、これを行うことができませんでしたか?

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

VB .NET では、C# インデクサーが "Item" プロパティを介してサポートされていることを知っているので、同じ考え方が ASP でも機能する可能性があります。

于 2011-01-08T01:25:32.523 に答える