Frage

Ich versuche, eine Sammlung von Abteilungen aus einer .NET-Assembly zurück von ASP über COM Interop verbraucht werden. .NET würde ich nur eine generische Sammlung zurückgeben, z List<Department>, aber es scheint, dass Generika nicht gut mit COM-Interop. Also, was sind meine Optionen?

würde Ich mag sowohl über die Liste durchlaufen und in der Lage durch den Index auf ein Element zuzugreifen. Sollte ich von List<Department> erben, implementieren eine IList, IList<Department> oder eine andere Schnittstelle, oder gibt es einen besseren Weg? Idealerweise würde ich es vorziehen, nicht eine eigene Kollektion für jede Art von Liste, die ich brauche, um zu realisieren. Außerdem wird List[index] auch mit COM-Interop arbeiten?

Danke, Mike

Beispiel .NET-Komponenten (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
    }
}

Beispiel ASP-Code:

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

ähnliche Fragen:

War es hilfreich?

Lösung

Nach einiger mehr Forschung und Trial-and-error, ich glaube, ich eine Lösung gefunden System.Collections.ArrayList verwenden. Allerdings funktioniert das nicht mit einem Wert von Index zu bekommen. Dazu habe ich eine neue Klasse, die von ComArrayList ArrayList erbt und fügt neue Methoden GetByIndex und SetByIndex.

COM Interop kompatibel Sammlung:

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

Aktualisiert .NET Komponente MyLibrary.GetDepartments:

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

Aktualisiert ASP:

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

Andere Tipps

Da Sie nur die Daten in ASP raubend, würde ich vorschlagen Department[] zurück. Dies sollte direkt an einen SAFEARRAY in COM abzubilden. Es unterstützt Enumeration und indexierten Zugang zu.

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

In Ihrem ASP-Code, können Sie dies nicht tun?

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

Ich weiß, dass in VB .NET, C # Indexer wird über die "Item" Eigenschaft unterstützt, so dass die gleiche Idee kann in ASP arbeiten.

Ich habe versucht, das gleiche Problem in vb.net zu adressieren (nicht fließend in C #).

Da List (Of T) die IList-Schnittstelle unterstützt, für die COM-Schnittstelle für meine Objekte habe ich versucht, die Angabe

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

und dann in der öffentlichen Schnittstelle angeben, dass COM sieht

ReadOnly Property MyList As IList

Dies scheint von einem klassischen ASP-Client zu funktionieren, das das Objekt instanziiert, ruft eine Generatorfunktion und liest dann MyList Eigenschaft wie ein Array.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top