Was sind Alternativen zu generischen Sammlungen für COM-Interop?
-
06-07-2019 - |
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:
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.