I am attempting to return a collection of departments from a .NET assembly to be consumed by ASP via COM Interop. Using .NET I would just return a generic collection, e.g. List<Department>
, but it seems that generics don't work well with COM Interop. So, what are my options?
I would like to both iterate over the list and be able to access an item by index. Should I inherit from List<Department>
, implement an IList
, IList<Department>
or another interface, or is there a better way? Ideally I would prefer not to have to implement a custom collection for every type of list I need. Also, will List[index]
even work with COM Interop?
Thanks, Mike
Example .NET components (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
}
}
Example ASP code:
<%
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 %>
Related questions:
-
After some more research and trial-and-error, I think I found a solution by using
System.Collections.ArrayList
. However, this does not work with getting a value by index. To do so, I created a new classComArrayList
that inherits fromArrayList
and adds new methodsGetByIndex
andSetByIndex
.COM Interop compatible collection:
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; } }
Updated .NET component MyLibrary.GetDepartments:
public ComArrayList GetDepartments() { // return a list of Departments from the database }
Updated ASP:
<h1>The third department</h1> <%= departments.GetByIndex(2).Name %>
-
Since you are only consuming the data in ASP, I would suggest returning
Department[]
. This should map directly to a SAFEARRAY in COM. It supports enumeration and indexed access too.public Department[] GetDepartments() { var departments = new List<Department>(); // populate list from database return departments.ToArray(); }
0 comments:
Post a Comment