Pergunta

Eu estou tentando retornar uma coleção de departamentos de um .NET assembly para ser consumido por ASP através de interoperabilidade. Usando .NET Gostaria apenas de retornar uma coleção genérica, por exemplo, List<Department>, mas parece que os genéricos não funcionam bem com interoperabilidade. Então, quais são as minhas opções?

Gostaria de ambos iterar sobre a lista e ser capaz de acessar um item de índice. Devo herdar de List<Department>, implementar um IList, IList<Department> ou de outra interface, ou há uma maneira melhor? Idealmente, eu preferiria não ter que implementar uma coleção personalizada para cada tipo de necessidade lista I. Além disso, vai List[index] trabalho, mesmo com interoperabilidade?

Obrigado, Mike

componentes Exemplo 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
    }
}

Exemplo 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 %>

Perguntas relacionadas:

Foi útil?

Solução

Depois de mais algumas pesquisas e de tentativa e erro, eu acho que encontrei uma solução usando System.Collections.ArrayList. No entanto, isso não funciona com a obtenção de um valor de índice. Para fazê-lo, eu criei um novo ComArrayList classe que herda de ArrayList e adiciona novos métodos GetByIndex e SetByIndex.

COM Interop coleção compatível:

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

.NET Atualizado MyLibrary.GetDepartments componentes:

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

Atualizado ASP:

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

Outras dicas

Uma vez que você só está consumindo os dados em ASP, gostaria de sugerir o retorno Department[]. Isso deve mapear diretamente para um SAFEARRAY no COM. Ele suporta enumeração e acesso indexado também.

public Department[] GetDepartments() {
    var departments = new List<Department>();
    // populate list from database
    return departments.ToArray();
}

Em seu código ASP, você não poderia fazer isso?

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

Eu sei que em VB .NET, C # indexadores são suportados através da propriedade "Item", de modo que a mesma idéia pode trabalhar em ASP.

Eu tenho tentado para resolver este mesmo problema em vb.net (não fluente em C #).

Desde List (Of T) suporta a interface IList, para a interface COM para os meus objetos Eu tentei especificando

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

e, em seguida, especificando na interface pública que COM vê

ReadOnly Property MyList As IList

Este parece funcionar bem de um cliente ASP clássico que instancia o objeto, chama uma função gerador e, em seguida, lê propriedade MyList como um array.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top