سؤال

بافتراض أن لدي فقط اسم فئة عام كسلسلة في شكل "MyCustomGenericCollection(of MyCustomObjectClass)" ولا أعرف التجميع الذي يأتي منه، ما هي أسهل طريقة لإنشاء مثيل لهذا الكائن؟

إذا كان ذلك مفيدًا، فأنا أعلم أن الفصل يطبق IMyCustomInterface وهو من تجميع تم تحميله في AppDomain الحالي.

أعطى ماركوس أولسون مثالاً ممتازًا هنا, ، لكنني لا أرى كيفية تطبيقه على الأدوية الجنيسة.

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

المحلول

بمجرد تحليله، استخدم Type.GetType(سلسلة) للحصول على مرجع للأنواع المعنية، ثم استخدم Type.MakeGenericType(Type[]) لبناء النوع العام المحدد الذي تحتاجه.ثم استخدام Type.GetConstructor(Type[]) للحصول على مرجع إلى مُنشئ لنوع عام محدد، ثم الاتصال أخيرًا معلومات البناء للحصول على مثيل للكائن.

Type t1 = Type.GetType("MyCustomGenericCollection");
Type t2 = Type.GetType("MyCustomObjectClass");
Type t3 = t1.MakeGenericType(new Type[] { t2 });
ConstructorInfo ci = t3.GetConstructor(Type.EmptyTypes);
object obj = ci.Invoke(null);

نصائح أخرى

مقالة MSDN كيف:فحص ومثيل الأنواع العامة مع التأمل يصف كيف يمكنك استخدام الانعكاس لإنشاء مثيل من النوع العام.نأمل أن يساعدك استخدام ذلك مع نموذج ماركسوس في البدء.

إذا كنت لا تمانع في الترجمة إلى VB.NET، فيجب أن يعمل شيء مثل هذا

foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
    // find the type of the item
    Type itemType = assembly.GetType("MyCustomObjectClass", false);
    // if we didnt find it, go to the next assembly
    if (itemType == null)
    {
        continue;
    }
    // Now create a generic type for the collection
    Type colType = assembly.GetType("MyCusomgGenericCollection").MakeGenericType(itemType);;

    IMyCustomInterface result = (IMyCustomInterface)Activator.CreateInstance(colType);
    break;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top