आपको उन सभी प्रकारों का संग्रह कैसे मिलता है जो एक विशिष्ट अन्य प्रकार से प्राप्त होते हैं?
आपको उन सभी प्रकारों का संग्रह कैसे मिलता है जो एक विशिष्ट अन्य प्रकार से प्राप्त होते हैं?
जवाबों:
कुछ इस तरह:
public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
return assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t));
}
यदि आपको जेनेरिक को संभालने की आवश्यकता है, तो यह कुछ हद तक पेचीदा हो जाता है (जैसे खुले List<>
प्रकार से गुजरना लेकिन एक प्रकार जो वापस से प्राप्त करने की अपेक्षा करता है List<int>
)। अन्यथा यह आसान है :)
यदि आप स्वयं प्रकार को बाहर करना चाहते हैं, तो आप इतनी आसानी से कर सकते हैं:
public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
return assembly.GetTypes().Where(t => t != baseType &&
baseType.IsAssignableFrom(t));
}
ध्यान दें कि यह आपको एक इंटरफ़ेस निर्दिष्ट करने और सभी प्रकारों को खोजने की अनुमति देगा जो इसे लागू करने के बजाय केवल कक्षाओं के साथ काम Type.IsSubclassOf
करता है।
IsAssignableFrom
साथ ही काम करना चाहिए। विशेष रूप से, मेरा संस्करण इंटरफेस के साथ भी कॉपी करता है। आपने मेरे कोड का परीक्षण किया? मेरा उत्तर किस मामले पर विफल है?
निम्न विधि से उन प्रकारों का एक संग्रह मिलेगा जो एक प्रकार का वारिस होता है।
सी#
public IEnumerable<Type> FindSubClassesOf<TBaseType>()
{
var baseType = typeof(TBaseType);
var assembly = baseType.Assembly;
return assembly.GetTypes().Where(t => t.IsSubclassOf(baseType));
}
VB.NET
Public Function FindSubClasses(Of TBaseType)() As IEnumerable(Of Type)
Dim baseType = GetType(TBaseType)
Dim assembly = baseType.Assembly
Return From t In assembly.GetTypes()
Where t.IsSubClassOf(baseType)
Select t
End Function
यदि आपको उस प्रकार को शामिल करने की आवश्यकता है जो एक इंटरफ़ेस को लागू करता है तो देखें @Jon Skeet का उत्तर।
आपको सभी प्रकारों की गणना करनी होगी और प्रत्येक के लिए जांच करनी होगी कि क्या वह आपके द्वारा खोजा जा रहा है।
इस प्रश्न में एक जैसा कुछ कोड आपके लिए उपयोगी हो सकता है।
इस पद्धति का उपयोग करने पर विचार करें (PCL के लिए लिखा गया है):
public IEnumerable<Type> FindDerivedTypes( Assembly assembly, Type baseType )
{
TypeInfo baseTypeInfo = baseType.GetTypeInfo();
bool isClass = baseTypeInfo.IsClass, isInterface = baseTypeInfo.IsInterface;
return
from type in assembly.DefinedTypes
where isClass ? type.IsSubclassOf( baseType ) :
isInterface ? type.ImplementedInterfaces.Contains( baseTypeInfo.AsType() ) : false
select type.AsType();
}