التكرار من خلال قائمة عامة من النوع غير المعروف في وقت التشغيل في VB.Net
-
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.
والشيء نفسه يمكن أن يتحقق إذا كان لديك الأشياء التي هي في قائمة تنفيذ واجهة معينة. وبهذه الطريقة يمكنك تعبئة قائمة مع أي نوع الكائن طالما أنها تنفذ واجهة، فإن طريقة التكرار تعمل فقط على القيم المشتركة بين أنواع الكائنات.