utilizado uso una tipos son sintaxis siguientes que para namespace metodos maneja los listas lista las genéricas genérica genericas estructuras dinamica diferentes cuáles cuál colección colecciones clases .net generics collections asp-classic com-interop

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