كيفية التعامل مع واجهة تحميلها بشكل حيوي من التجمع والاحتجاج أعضائها
-
07-07-2019 - |
سؤال
ولقد حصلت بعض رمز لتحميل تجميع والحصول على جميع أنواع، التي تنفذ واجهة معينة، مثل هذا (تفترض ASM هو تجميع صالح وتحميل).
var results = from type in asm.GetTypes()
where typeof(IServiceJob).IsAssignableFrom(type)
select type;
والآن أنا عالقة: أنا بحاجة إلى إنشاء مثيلات هذه الكائنات واستدعاء أساليب وخصائص على الكائن. ولست بحاجة لتخزين الإشارات إلى الكائنات التي تم إنشاؤها في مجموعة لاحق الاستخدام.
المحلول
وأوه نجاح باهر - أنا فقط rel="noreferrer"> ل قبل بضعة أيام. وهنا لي طريقة للعودة الحالات من جميع الأنواع التي تنفذ واجهة معينة:
private static IEnumerable<T> InstancesOf<T>() where T : class
{
var type = typeof(T);
return from t in type.Assembly.GetExportedTypes()
where t.IsClass
&& type.IsAssignableFrom(t)
&& t.GetConstructor(new Type[0]) != null
select (T)Activator.CreateInstance(t);
}
إذا ريفاكتور هذا لقبول المعلمة التجميع بدلا من استخدام واجهة التجمع، يصبح مرنا بما يكفي لتناسب حاجتك.
نصائح أخرى
ويمكنك إنشاء مثيل من نوع مع أسلوب Activator.CreateInstance
: -
IServiceJob x = Activator.CreateInstance(type);
وهكذا يصبح التعليمات البرمجية: -
IServiceJob[] results = (from type in asm.GetTypes()
where typeof(IServiceJob).IsAssignableFrom(type)
select (IServiceJob)Activator.CreateInstance(type)).ToArray();
و(ملاحظة تغيير فار إلى IServiceJob [] أن نوضح ما يجري خلق).
لا تنتمي إلى StackOverflow