我正在尝试从.NET程序集返回一系列部门,以便通过COM Interop使用ASP。使用.NET我只会返回一个通用集合,例如List<Department>
,但似乎仿制药与COM Interop不兼容。那么,我的选择是什么?
我想迭代列表并能够通过索引访问项目。我应该继承List<Department>
,实施IList
,IList<Department>
或其他界面,还是有更好的方法?理想情况下,我不希望为我需要的每种类型的列表实现自定义集合。此外,List[index]
甚至可以使用COM Interop吗?
谢谢, 麦克
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
}
}
<%
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 %>
答案 0 :(得分:11)
经过一些研究和反复试验,我认为我使用System.Collections.ArrayList
找到了解决方案。但是,这不适用于通过索引获取值。为此,我创建了一个继承自ComArrayList
的新类ArrayList
,并添加了新方法GetByIndex
和SetByIndex
。
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;
}
}
public ComArrayList GetDepartments() {
// return a list of Departments from the database
}
<h1>The third department</h1>
<%= departments.GetByIndex(2).Name %>
答案 1 :(得分:5)
由于您只使用ASP中的数据,我建议您返回Department[]
。这应该直接映射到COM中的SAFEARRAY。它也支持枚举和索引访问。
public Department[] GetDepartments() {
var departments = new List<Department>();
// populate list from database
return departments.ToArray();
}
答案 2 :(得分:1)
在你的ASP代码中,你能不这样做吗?
<h1>The third department</h1>
<%= departments.Item(2).Name %>
我知道在VB .NET中,C#索引器是通过“Item”属性支持的,所以同样的想法可能在ASP中有效。
答案 3 :(得分:0)
我一直在尝试在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
这似乎可以从经典的ASP客户端中实现,该客户端实例化对象,调用生成器函数,然后像数组一样读取MyList属性。