COM Interop의 일반 컬렉션에 대한 대안은 무엇입니까?
-
06-07-2019 - |
문제
COM Interop을 통해 ASP가 소비 할 .NET 어셈블리의 부서 모음을 반환하려고합니다. .NET를 사용하여 일반 컬렉션을 반환합니다. List<Department>
, 그러나 제네릭은 COM Interop과 잘 작동하지 않는 것 같습니다. 그래서 내 옵션은 무엇입니까?
나는 목록을 반복하고 색인별로 항목에 액세스 할 수 있기를 원합니다. 내가 상속해야합니다 List<Department>
, 구현 IList
, IList<Department>
아니면 다른 인터페이스, 아니면 더 좋은 방법이 있습니까? 이상적으로는 필요한 모든 유형의 목록에 대해 사용자 정의 컬렉션을 구현하지 않아도됩니다. 또한, 의지 List[index]
COM Interop과 함께 일합니까?
고마워요, 마이크
예 .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 %>
관련 질문 :
해결책
더 많은 연구와 시험과 반사 후, 나는 사용하여 해결책을 찾았다 고 생각합니다. 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 %>
다른 팁
ASP에서 데이터 만 소비하므로 반환하는 것이 좋습니다. Department[]
. 이것은 com의 Safearray에 직접 매핑되어야합니다. 열거 및 색인 액세스도 지원합니다.
public Department[] GetDepartments() {
var departments = new List<Department>();
// populate list from database
return departments.ToArray();
}
ASP 코드 에서이 작업을 수행 할 수 없습니까?
<h1>The third department</h1>
<%= departments.Item(2).Name %>
VB .NET에서 C# 인덱서는 "항목"속성을 통해 지원되므로 ASP에서 동일한 아이디어가 작동 할 수 있습니다.
VB.NET 에서이 같은 문제를 해결하려고 노력했습니다 (C#에서 유창하지 않음).
목록 (t)은 ILIST 인터페이스를 지원하기 때문에 내 객체의 COM 인터페이스에 대한 ILIST 인터페이스를 지원합니다.
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
이것은 객체를 인스턴스화하고 발전기 기능을 호출 한 다음 배열처럼 MyList 속성을 읽는 클래식 ASP 클라이언트에서 잘 작동하는 것 같습니다.