Каковы альтернативы универсальным коллекциям для COM Interop? - PullRequest
10 голосов
/ 06 ноября 2008

Я пытаюсь вернуть коллекцию отделов из сборки .NET для использования ASP через COM Interop. Используя .NET, я бы просто вернул общую коллекцию, например, List<Department>, но похоже, что дженерики плохо работают с COM Interop. Итак, какие у меня варианты?

Я бы хотел пройтись по списку и получить доступ к элементу по индексу. Должен ли я наследовать от List<Department>, реализовать IList, IList<Department> или другой интерфейс, или есть лучший способ? В идеале я бы предпочел не создавать собственную коллекцию для каждого типа списка, который мне нужен. Кроме того, List[index] будет работать даже с COM Interop?

Спасибо, Mike

Пример компонентов .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
    }
}

Пример кода 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 %>

Похожие вопросы:

Ответы [ 4 ]

11 голосов
/ 06 ноября 2008

После некоторых исследований и проб и ошибок, я думаю, что нашел решение, используя System.Collections.ArrayList. Однако это не работает с получением значения по индексу. Для этого я создал новый класс ComArrayList, который наследуется от ArrayList и добавляет новые методы GetByIndex и SetByIndex.

Коллекция, совместимая с 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;
    }
}

Обновлен компонент .NET MyLibrary.GetDepartments:

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

Обновлен ASP:

<h1>The third department</h1>
<%= departments.GetByIndex(2).Name %>
5 голосов
/ 07 декабря 2009

Поскольку вы используете только данные в ASP, я бы предложил вернуть Department[]. Это должно отображаться непосредственно на SAFEARRAY в COM. Он также поддерживает перечисление и индексированный доступ.

public Department[] GetDepartments() {
    var departments = new List<Department>();
    // populate list from database
    return departments.ToArray();
}
1 голос
/ 08 января 2011

В вашем коде ASP, не могли бы вы сделать это?

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

Я знаю, что в VB .NET индексаторы C # поддерживаются через свойство "Item", поэтому та же идея может работать в ASP.

0 голосов
/ 20 февраля 2012

Я пытался решить эту же проблему в vb.net (не владею C #).

Поскольку List (Of T) поддерживает интерфейс IList, для интерфейса COM для моих объектов я попытался указать

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

и затем указание в публичном интерфейсе, что COM видит

ReadOnly Property MyList As IList

Кажется, что это нормально работает с классическим клиентом ASP, который создает экземпляр объекта, вызывает функцию генератора и затем читает свойство MyList как массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...