.net - uso - ¿Cuáles son las alternativas a las colecciones genéricas para COM Interop?
namespace listas genericas (4)
Estoy tratando de devolver una colección de departamentos de un ensamblado .NET para ser consumido por ASP a través de COM Interop. Usando .NET, simplemente devolvería una colección genérica, por ejemplo, List<Department>
, pero parece que los genéricos no funcionan bien con COM Interop. ¿Entonces cuales son mis opciones?
Me gustaría iterar sobre la lista y poder acceder a un elemento por índice. ¿Debo heredar de List<Department>
, implementar un IList
, IList<Department>
u otra interfaz, o hay una mejor manera? Idealmente, preferiría no tener que implementar una colección personalizada para cada tipo de lista que necesito. Además, ¿ List[index]
incluso funcionará con COM Interop?
Gracias, Mike
Ejemplo de componentes .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
}
}
Ejemplo de código 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 %>
Preguntas relacionadas:
Después de investigar un poco más y probar y error, creo que encontré una solución usando System.Collections.ArrayList
. Sin embargo, esto no funciona con obtener un valor por índice. Para hacerlo, creé una nueva clase ComArrayList
que hereda de ArrayList
y agrega nuevos métodos GetByIndex
y SetByIndex
.
Colección compatible COM Interop:
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;
}
}
Componente .NET actualizado MyLibrary.GetDepartments:
public ComArrayList GetDepartments() {
// return a list of Departments from the database
}
ASP actualizado:
<h1>The third department</h1>
<%= departments.GetByIndex(2).Name %>
Como solo está consumiendo los datos en ASP, sugeriría que se devuelva el Department[]
. Esto debería corresponder directamente con un SAFEARRAY en COM. Es compatible con la enumeración y el acceso indexado también.
public Department[] GetDepartments() {
var departments = new List<Department>();
// populate list from database
return departments.ToArray();
}
En su código ASP, ¿no podría hacer esto?
<h1>The third department</h1>
<%= departments.Item(2).Name %>
Sé que en VB .NET, los indexadores C # son compatibles a través de la propiedad "Artículo", por lo que la misma idea puede funcionar en ASP.
He intentado abordar este mismo problema en vb.net (no fluido en C #).
Como List (Of T) admite la interfaz IList, para la interfaz COM para mis objetos he intentado especificar
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
y luego especificando en la interfaz pública que COM ve
ReadOnly Property MyList As IList
Esto parece funcionar bien desde un clásico cliente ASP que crea una instancia del objeto, llama a una función del generador y luego lee la propiedad MyList como una matriz.