নির্দিষ্ট ধরণের অন্যান্য অংশ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত সমস্ত প্রকারের সংগ্রহ আপনি কীভাবে পাবেন?
নির্দিষ্ট ধরণের অন্যান্য অংশ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত সমস্ত প্রকারের সংগ্রহ আপনি কীভাবে পাবেন?
উত্তর:
কিছুটা এইরকম:
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));
}
ভিবি.এনইটি
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
যদি আপনাকে এমন ধরণের অন্তর্ভুক্ত করতে হয় যা কোনও ইন্টারফেস প্রয়োগ করে তবে জোন স্কিটির উত্তর দেখুন।
আপনাকে সমস্ত প্রকারের গণনা করতে হবে এবং আপনি যা অনুসন্ধান করছেন তার উত্তরাধিকার সূত্রে প্রাপ্ত কিনা তা প্রতিটিের জন্য পরীক্ষা করতে হবে।
এই প্রশ্নের মতো কিছু কোড আপনার জন্য কার্যকর হতে পারে।
এই পদ্ধতিটি ব্যবহার করার বিষয়ে বিবেচনা করুন (পিসিএল জন্য লিখিত):
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();
}