التكرار من خلال قائمة عامة من النوع غير المعروف في وقت التشغيل في VB.Net

StackOverflow https://stackoverflow.com/questions/269660

  •  06-07-2019
  •  | 
  •  

سؤال

هل يعرف أحد كيفية التكرار على قائمة عامة إذا لم يكن نوع تلك القائمة معروفًا حتى وقت التشغيل؟

على سبيل المثال، افترض obj1 يتم تمريرها إلى وظيفة باعتبارها Object:

Dim t As Type = obj1.GetType
If t.IsGenericType Then
    Dim typeParameters() As Type = t.GetGenericArguments()
    Dim typeParam As Type = typeParameters(0)
End If

لو obj يتم تمريره ك List(Of String) ثم باستخدام ما ورد أعلاه يمكنني تحديد أن القائمة العامة (t) تم تمريره وأنه من النوع String (typeParam).أعلم أنني أقوم بافتراض كبير بأن هناك معلمة عامة واحدة فقط، ولكن هذا جيد بالنسبة لهذا المثال البسيط.

ما أود معرفته هو، بناءً على ما سبق، كيف أفعل شيئًا كهذا:

For Each item As typeParam In obj1
    'do something with it here
Next

أو حتى شيء بسيط مثل الحصول عليه obj1.Count().

هل كانت مفيدة؟

المحلول

إذا كنت تعرف أن obj هو قائمة عامة.إذن أنت محظوظ.

تطبق القائمة العامة IList وIEnumerable (كلاهما غير عام).لذلك يمكنك الإرسال إلى أي من تلك الواجهات ثم لكل منها.

  • Ilist لديه خاصية العد.
  • لدى Ilist أيضًا طريقة Cast.إذا كنت لا تعرف النوع الذي تريد الإرسال إليه، فاستخدم الكائن.سيعطيك هذا IEnumerable(Object) الذي يمكنك بعد ذلك البدء في استخدام Linq مقابله.

نصائح أخرى

والطريقة التي تتكرر على قائمتك يمكن تحديد نوع عام:

Public Sub Foo(Of T)(list As List(Of T))
  For Each obj As T In list
     ..do something with obj..
  Next
End Sub

وحتى ذلك الحين يمكنك الاتصال على:

Dim list As New List(Of String)
Foo(Of String)(list)

وهذا الأسلوب يجعل رمز تبدو شعر قليلا، على الأقل في VB.NET.

والشيء نفسه يمكن أن يتحقق إذا كان لديك الأشياء التي هي في قائمة تنفيذ واجهة معينة. وبهذه الطريقة يمكنك تعبئة قائمة مع أي نوع الكائن طالما أنها تنفذ واجهة، فإن طريقة التكرار تعمل فقط على القيم المشتركة بين أنواع الكائنات.

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