سؤال

أحاول إرجاع مجموعة من الأقسام من مجموعة .NET ليتم استهلاكها بواسطة ASP عبر COM Interop.باستخدام .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[].يجب أن يتم تعيين هذا مباشرةً إلى SAFEARRAY في COM.وهو يدعم التعداد والوصول المفهرس أيضًا.

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#).

نظرًا لأن 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 مثل المصفوفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top