كيف أقارن الأنواع عند استخدام الأدوية الجينية؟

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

سؤال

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

ومع ذلك ، فإن هذا يفشل عند استخدام التفكير حتى الآن عند عدم استخدام الانعكاس ، فهو يعمل بشكل جيد.

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

تحفظات:

  1. يمكن أن يكون أو لا يمكن أن يكون عامًا ، مثل 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

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