11

我试图从 .NET 程序集中返回一组部门,以供 ASP 通过 COM 互操作使用。使用 .NET 我只会返回一个泛型集合,例如List<Department>,但泛型似乎不适用于 COM 互操作。那么,我有哪些选择?

我想遍历列表并能够按索引访问项目。我应该继承、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并添加了新方法GetByIndexSetByIndex.

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

在您的 ASP 代码中,您不能这样做吗?

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

我知道在 VB .NET 中,C# 索引器是通过“Item”属性支持的,所以同样的想法可能在 ASP 中起作用。

于 2011-01-08T01:25:32.523 回答
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 回答