কোনও অ্যাসেমব্লিতে সমস্ত ধরণের কীভাবে সুনির্দিষ্ট টাইপ সি # থেকে প্রাপ্ত হন


95

নির্দিষ্ট ধরণের অন্যান্য অংশ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত সমস্ত প্রকারের সংগ্রহ আপনি কীভাবে পাবেন?

উত্তর:


155

কিছুটা এইরকম:

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করে না।


4
ধন্যবাদ! আমি এই ধন্যবাদ ব্যবহার করে শেষ করেছি - আমি এই সর্বজনীন স্থিতির তালিকাটি ব্যবহার করে শেষ করেছি <টাইপ> GetAllSubclassOf (টাইপ বেসটাইপ) Assembly ফেরত এসেম্বলি.গেটঅ্যাস্পাবেশন (বেসটাইপ) .গেটটাইপস ()। যেখানে (টাইপ => টাইপ.আইএসএসব্ল্যাকসঅফ (বেসটাইপ))। তালিকা(); }
অ্যাসিঞ্জিহোলে

ডাউনভোটার এখানে আমার মন্তব্য অনুপস্থিত। অ্যাসিঞ্জিহোল দ্বারা নির্দেশিত উত্তরটি ভুল। আমি কোডটি কাজ করে না এমন পর্যন্ত আমি এসেস মন্তব্যটি মিস না করায় আমি সঠিক উত্তরটি যুক্ত করেছি। শুভ বড়দিন।
টিম মারফি

@ টিম: এটি ভুল নয়, এটি কিছুটা আলাদা। IsAssignableFromপাশাপাশি কাজ করা উচিত। বিশেষত, আমার সংস্করণটি ইন্টারফেসগুলির সাথেও অনুলিপি করে। আপনি আমার কোড পরীক্ষা করেছেন? আমার উত্তরটি কোন ক্ষেত্রে ব্যর্থ হয়?
জন স্কিটি

4
@ জন ঠিক আপনার পদ্ধতি ইন্টারফেস পরিচালনা করে। আমি একজন ভিবি প্রোগ্রামার, আমরা ক্লাসের উত্তরাধিকারী এবং ইন্টারফেস প্রয়োগ করি। এটি কি সি # তে আলাদা? আমি জিজ্ঞাসা করি কারণ প্রশ্নটি যেমনটি আমার প্রয়োজন অনুসারে প্রকারের উত্তরাধিকার সূত্রে প্রকারকে প্রয়োগ করে না সেগুলি চায়।
টিম মারফি

4
@ টিম: সি # তে আমরা কেবল ":" উভয়ের জন্যই ব্যবহার করি ... তবে আমি সাধারণত ইন্টারফেসগুলিকে কোনও ধরণের উত্তরাধিকারের স্তরক্রমের অংশ হিসাবে বিবেচনা করব।
জন স্কিটি

27

নিম্নলিখিত পদ্ধতিটি এমন ধরণের সংকলন পাবে যা কোনও ধরণের উত্তরাধিকার সূত্রে প্রাপ্ত।

সি #

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

যদি আপনাকে এমন ধরণের অন্তর্ভুক্ত করতে হয় যা কোনও ইন্টারফেস প্রয়োগ করে তবে জোন স্কিটির উত্তর দেখুন।


1

আপনাকে সমস্ত প্রকারের গণনা করতে হবে এবং আপনি যা অনুসন্ধান করছেন তার উত্তরাধিকার সূত্রে প্রাপ্ত কিনা তা প্রতিটিের জন্য পরীক্ষা করতে হবে।

এই প্রশ্নের মতো কিছু কোড আপনার জন্য কার্যকর হতে পারে।


1

এই পদ্ধতিটি ব্যবহার করার বিষয়ে বিবেচনা করুন (পিসিএল জন্য লিখিত):

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();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.