كيف أقارن الأنواع عند استخدام الأدوية الجينية؟
-
05-07-2019 - |
سؤال
أحاول استخلاص نوع كائن في وقت التشغيل. على وجه التحديد ، أحتاج إلى معرفة شيئين سواء كان ينفذ ICollection أو IDTO. حاليا الحل الوحيد الذي تمكنت من العثور عليه هو:
private static bool IsACollection(PropertyDescriptor descriptor)
{
bool isCollection = false;
foreach (Type type in descriptor.PropertyType.GetInterfaces())
{
if (type.IsGenericType)
{
if (type.GetGenericTypeDefinition() == typeof(ICollection<>))
{
isCollection = true;
break;
}
}
else
{
if (type == typeof(ICollection))
{
isCollection = true;
break;
}
}
}
return isCollection;
}
private static bool IsADto(PropertyDescriptor descriptor)
{
bool isDto = false;
foreach (Type type in descriptor.PropertyType.GetInterfaces())
{
if (type == typeof(IDto))
{
isDto = true;
break;
}
}
return isDto;
}
ومع ذلك أنا مقتنع أنه يجب أن يكون هناك طريقة أفضل من هذا. لقد حاولت المقارنة بطريقة طبيعية مثل:
if(descriptor.PropertyType == typeof(ICollection<>))
ومع ذلك ، فإن هذا يفشل عند استخدام التفكير حتى الآن عند عدم استخدام الانعكاس ، فهو يعمل بشكل جيد.
لا أريد التكرار من خلال واجهات كل مجال من حقل كياني. هل يمكن لأحد أن يلقي بعض الضوء على طريقة أخرى للقيام بذلك؟ نعم ، أنا تحسين قبل الأوان ، لكنه يبدو قبيحًا جدًا لذا من فضلك أذهلني.
تحفظات:
- يمكن أن يكون أو لا يمكن أن يكون عامًا ، مثل Ilist <> أو مجرد arraylist وبالتالي لماذا أبحث عن iCollection أو iCollection <>. لذلك أفترض أنني يجب أن أستخدم isGenericType في عبارة if لمعرفة ما إذا كنت سأختبر باستخدام iCollection <> أم لا.
شكرا مقدما!
المحلول
هذه:
type == typeof(ICollection)
سوف تحقق ما إذا كان نوع العقار بالضبط ICollection
. هذا هو ، سوف يعود صحيح ل:
public ICollection<int> x { get; set; }
ولكن ليس من أجل:
public List<int> x { get; set; }
إذا كنت تريد التحقق مما إذا كان نوع الخاصية هو ، أو مشتق من, ICollection
, ، أبسط طريقة هي الاستخدام Type.IsAssignableFrom
:
typeof(ICollection).IsAssignableFrom(type)
وينطبق الشيء نفسه على عام:
typeof(ICollection<>).IsAssignableFrom(type.GetGenericTypeDefinition())
نصائح أخرى
يفعل type.IsAssignable
مساعدة في هذه الحالة؟
تحرير: آسف ، كان ينبغي أن يكون Type.IsAssignableFrom