سؤال

var x = new { a = "foobar", b = 42 };
List<x.GetType()> y;

هل هناك طريقة مختلفة لفعل ما أريد أن أفعله هنا؟

إذا لم يكن هناك ، فأنا لا أرى كل هذا النقطة في الأنواع الضمنية ...

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

المحلول

x.GetType() هي استدعاء الطريقة ، تم تقييمها في وقت التنفيذ. لذلك لا يمكن استخدامه ل وقت الترجمة مفهوم مثل نوع المتغير. أوافق على أنه من المفيد أحيانًا أن تكون قادرًا على القيام بشيء مماثل (تحديد نوع وقت الترجمة للمتغير كوسيطة نوع في مكان آخر) ، ولكن في الوقت الحالي لا يمكنك ذلك. لا أستطيع أن أقول إنني أفتقدها بانتظام.

ولكن هل تستطيع فعل:

var x = new { a = "foobar", b = 42 };
var y = new[] { x };
var z = y.ToList();

يمكنك أيضًا كتابة طريقة تمديد بسيطة لإنشاء قائمة بشكل عام:

public static List<T> InList<T>(this T item)
{
    return new List<T> { item };
}

(اختر اسمًا مختلفًا إذا كنت تريد :)

ثم:

var x = new { a = "foobar", b = 42 };
var y = x.InList();

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

تعد المتغيرات المحلية المكتوبة ضمنيًا مفيدة لعدة أسباب ، لكنها مفيدة بشكل خاص في LINQ حتى تتمكن من إنشاء إسقاط مخصص دون إنشاء نوع جديد تمامًا.

نصائح أخرى

هناك طرق للقيام بذلك بطريقة عامة:

public static List<T> CreateList<T>(T example) {
    return new List<T>();
}
...
var list = CreateList(x);

أو عن طريق إنشاء قائمة مع البيانات ثم إفراغها ...

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