से derrived कर रहे हैं मुझे खुशी है कि यह एक बहुत पुरानी सवाल है, लेकिन मैं मैं तारीख को सभी प्रश्नों के उत्तर के रूप में भविष्य के उपयोगकर्ताओं के लिए एक और उत्तर जोड़ना होगा कुछ फार्म का उपयोग सोचा Assembly.GetTypes
का।
जबकि GetTypes() वास्तव में सभी प्रकारों को वापस कर देगा, इसका मतलब यह नहीं है कि आप उन्हें सक्रिय कर सकते हैं और इस प्रकार संभावित रूप से ReflectionTypeLoadException
फेंक सकते हैं।
एक प्रकार होगा जब प्रकार लौटाया base
लेकिन base
से derived
derived
की है कि से एक अलग विधानसभा में परिभाषित किया जाता है सक्रिय करने में सक्षम नहीं होने के लिए एक उत्कृष्ट उदाहरण, एक विधानसभा कि बुला विधानसभा को संदर्भित नहीं करती।
तो कहते हैं कि हमने: जो AssemblyC
में है
Class A // in AssemblyA
Class B : Class A, IMyInterface // in AssemblyB
Class C // in AssemblyC which references AssemblyB but not AssemblyA
तो ClassC
में हम बाद में हामी भर जवाब के अनुसार कुछ करना:
var type = typeof(IMyInterface);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p));
तो यह एक ReflectionTypeLoadException
फेंक देते हैं।
इसका कारण यह है AssemblyC
में AssemblyA
के लिए एक संदर्भ के बिना आप के लिए सक्षम नहीं होगा:
var bType = typeof(ClassB);
var bClass = (ClassB)Activator.CreateInstance(bType);
दूसरे शब्दों ClassB
में लोड करने योग्य जो कुछ है कि GetTypes जांच के कॉल और पर फेंकता है नहीं है।
तो सुरक्षित रूप से इस Phil Haacked लेख Get All Types in an Assembly के अनुसार तो लोड करने योग्य प्रकार के लिए परिणाम सेट अर्हता और Jon Skeet code को आप के बजाय की तरह कुछ करना होगा:
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();
}
क्या उदाहरण कोड काम करता है?मुझे आपकी स्थिति के साथ झूठी नकारात्मकता मिली है। –
ऊपर दिए गए कोड में यदि कथन हमेशा गलत होगा क्योंकि आप परीक्षण कर रहे हैं कि टाइप क्लास (टी) का एक उदाहरण आपके इंटरफ़ेस को लागू करता है, जो तब तक नहीं होगा जब तक कि टाइप आईएमआईइंटरफेस (जिस स्थिति में यह हमेशा सत्य रहे)। – Liazy