আমি কৃতজ্ঞ এই একটি খুব পুরানো প্রশ্ন হল কিন্তু আমি আমি তারিখ ব্যবহারের কিছু ফর্ম থেকে সব উত্তর ভবিষ্যতে ব্যবহারকারীদের জন্য অন্য উত্তর যোগ হবে চিন্তা Assembly.GetTypes
।
যদিও গেটটাইপস () প্রকৃতপক্ষে সমস্ত প্রকারটি ফিরিয়ে দেবে, এর অর্থ এই নয় যে আপনি এগুলি সক্রিয় করতে পারেন এবং সম্ভবত এটি নিক্ষেপ করতে পারেন ReflectionTypeLoadException
।
কোনও ধরণের অ্যাক্টিভেট করতে না পারার একটি সর্বোত্তম উদাহরণটি যখন প্রকারটি ফেরত derived
পাঠানো হয় base
তবে base
তার থেকে আলাদা সমাবেশে সংজ্ঞায়িত করা হয় derived
, যে সমাবেশটি কলিং অ্যাসেম্বলিটি উল্লেখ করে না।
সুতরাং আমাদের বলুন:
Class A // in AssemblyA
Class B : Class A, IMyInterface // in AssemblyB
Class C // in AssemblyC which references AssemblyB but not AssemblyA
হতে পারে কিভাবে ClassC
, যা হয় AssemblyC
আমরা কি তবে গৃহীত উত্তর অনুযায়ী কিছু করতে:
var type = typeof(IMyInterface);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p));
তারপরে এটি নিক্ষেপ করবে ReflectionTypeLoadException
।
এর কারণ হল একটি রেফারেন্স ছাড়া হয় AssemblyA
এ AssemblyC
আপনাকে পারব না:
var bType = typeof(ClassB);
var bClass = (ClassB)Activator.CreateInstance(bType);
অন্য কথায় লোডযোগ্যClassB
নয় যা এমন কিছু যা গেটটাইপসকে কল করে এবং তা ছুড়ে দেয়।
ফলস্বরূপ লোডেবল ধরণের জন্য ফলাফল নির্ধারণের জন্য নিরাপদে যোগ্যতা অর্জনের জন্য এই ফিল হ্যাকড নিবন্ধ অনুসারে একটি অ্যাসেমব্লিতে সমস্ত প্রকার এবং জোন স্কিট কোড পান আপনি পরিবর্তে এর মতো কিছু করতে চান:
public static class TypeLoaderExtensions {
public static IEnumerable<Type> GetLoadableTypes(this Assembly assembly) {
if (assembly == null) throw new ArgumentNullException("assembly");
try {
return assembly.GetTypes();
} catch (ReflectionTypeLoadException e) {
return e.Types.Where(t => t != null);
}
}
}
এবং তারপর:
private IEnumerable<Type> GetTypesWithInterface(Assembly asm) {
var it = typeof (IMyInterface);
return asm.GetLoadableTypes().Where(it.IsAssignableFrom).ToList();
}