Pregunta

Estoy tratando de devolver una colección de los departamentos de la una .NETO de la asamblea para ser consumido por la ASP a través de la Interoperabilidad COM.El uso de .NETA yo acabo de volver de una colección genérica, por ejemplo, List<Department>, pero parece que los medicamentos genéricos no funcionan bien con la Interoperabilidad COM.Así que, ¿cuáles son mis opciones?

Me gustaría tanto iterar sobre la lista y ser capaz de tener acceso a un elemento por su índice.Debería heredar de List<Department>, implementar un IList, IList<Department> u otra interfaz, o hay una mejor manera?Idealmente, yo preferiría no tener que implementar una colección personalizada para cada tipo de lista de lo que necesito.También, se List[index] incluso el trabajo con la Interoperabilidad COM?

Gracias, Mike

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

Código ASP de ejemplo:

<%
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 con:

¿Fue útil?

Solución

Después de poco más de investigación y de prueba-y-error, creo que he encontrado una solución mediante el uso de System.Collections.ArrayList.Sin embargo, esto no funciona con la obtención de un valor de índice.Para ello, he creado una nueva clase ComArrayList que hereda de ArrayList y añade nuevos métodos GetByIndex y SetByIndex.

Interoperabilidad COM compatible colección:

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;
    }
}

Actualizado .NET componente MyLibrary.GetDepartments:

public ComArrayList GetDepartments() {
    // return a list of Departments from the database
}

Actualizado ASP:

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

Otros consejos

Como solo consume los datos en ASP, le sugiero que devuelva Department[]. Esto debería asignarse directamente a un SAFEARRAY en COM. También admite enumeración y acceso indexado.

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 de C # son compatibles a través de " Item " propiedad, por lo que la misma idea puede funcionar en ASP.

He estado tratando de resolver este mismo problema en vb.net (no domina C #).

Dado que List (Of T) admite la interfaz IList, para la interfaz COM de 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 cliente ASP clásico que instancia el objeto, llama a una función generadora y luego lee la propiedad MyList como una matriz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top