আপনি কীভাবে সি # তে প্রতিবিম্বের মাধ্যমে একটি নেমস্পেসে সমস্ত ক্লাস পাবেন?
আপনি কীভাবে সি # তে প্রতিবিম্বের মাধ্যমে একটি নেমস্পেসে সমস্ত ক্লাস পাবেন?
উত্তর:
নিম্নলিখিত namespace
সমাবেশে বর্তমান সমাবেশে নির্দিষ্ট করা ক্লাসের নাম মুদ্রণ করা হয়।
অন্যান্য ছেলেরা যেমন উল্লেখ করেছে, একটি নেমস্পেস বিভিন্ন মডিউলগুলির মধ্যে ছড়িয়ে দেওয়া যেতে পারে, তাই আপনাকে প্রথমে সমাবেশগুলির তালিকা পেতে হবে।
string nspace = "...";
var q = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.IsClass && t.Namespace == nspace
select t;
q.ToList().ForEach(t => Console.WriteLine(t.Name));
ফ্লাইওয়াত যেমন বলেছেন, একাধিক অ্যাসেমব্লিতে আপনার একই নাম স্থান থাকতে পারে (উদাহরণস্বরূপ System.Collections.Generic
)। যদি আপনি ইতিমধ্যে লোড না করে থাকে তবে আপনাকে সেগুলি সমস্ত লোড করতে হবে। সুতরাং একটি সম্পূর্ণ উত্তরের জন্য:
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(t => t.GetTypes())
.Where(t => t.IsClass && t.Namespace == @namespace)
আপনি অন্যান্য ডোমেনের ক্লাস না চাইলে এটি কাজ করা উচিত। সমস্ত ডোমেনের একটি তালিকা পেতে, এই লিঙ্কটি অনুসরণ করুন।
&& t.Namespace == @namespace
" অপসারণ করার চেষ্টা করেছি - যা আমাকে সমস্ত উপহার দিয়েছে। নেট সমাবেশগুলি :-)
&& t.Namespace == @namespace
আপনি সব পেতে শ্রেণীর এর সব সমাহারগুলি .net এর সহ। GetAssemblies
আপনাকে সমস্ত সমাবেশ GetAssemblies().SelectMany(t => t.GetTypes())
দেবে এবং সমস্ত সমাবেশ থেকে সমস্ত ধরণের (শ্রেণি, স্ট্রাক্ট ইত্যাদি) দেবে।
Assembly.Load(nameof(NameOfMyNamespace))
ঠিকঠাক কাজ করে কোনও অ্যাসেম্বলি লোড করতে বাধ্য করি ।
using System.Reflection;
using System.Collections.Generic;
//...
static List<string> GetClasses(string nameSpace)
{
Assembly asm = Assembly.GetExecutingAssembly();
List<string> namespacelist = new List<string>();
List<string> classlist = new List<string>();
foreach (Type type in asm.GetTypes())
{
if (type.Namespace == nameSpace)
namespacelist.Add(type.Name);
}
foreach (string classname in namespacelist)
classlist.Add(classname);
return classlist;
}
নোট: উপরের কোডটি কী চলছে তা চিত্রিত করে। আপনি যদি এটি বাস্তবায়ন করেন তবে একটি সরলীকৃত সংস্করণ ব্যবহার করা যেতে পারে:
using System.Linq;
using System.Reflection;
using System.Collections.Generic;
//...
static IEnumerable<string> GetClasses(string nameSpace)
{
Assembly asm = Assembly.GetExecutingAssembly();
return asm.GetTypes()
.Where(type => type.Namespace == nameSpace)
.Select(type => type.Name);
}
classlist
করেছেন এবং asm.GetTypes()
ফলাফলের উপরে প্রথম পুনরাবৃত্তিতে সরাসরি যুক্ত করেননি কেবল তা বের করার চেষ্টা করে আমাকে ধীর করে দেওয়া হয়েছিল।
একটি নির্দিষ্ট সমাবেশ, নেমস্পেস এবং ক্লাসনেমের জন্য:
var assemblyName = "Some.Assembly.Name"
var nameSpace = "Some.Namespace.Name";
var className = "ClassNameFilter";
var asm = Assembly.Load(assemblyName);
var classes = asm.GetTypes().Where(p =>
p.Namespace == nameSpace &&
p.Name.Contains(className)
).ToList();
দ্রষ্টব্য: প্রকল্পটি অবশ্যই সমাবেশটি উল্লেখ করবে
এখানে লোডারঅ্যাক্সপশন ত্রুটিগুলির জন্য একটি স্থিরতা আপনি খুঁজে পেতে পারেন সম্ভবত কোনও ধরণের একটি অন্য সমাবেশে টাইপ করে তবে:
// Setup event handler to resolve assemblies
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
Assembly a = System.Reflection.Assembly.ReflectionOnlyLoadFrom(filename);
a.GetTypes();
// process types here
// method later in the class:
static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}
এটি অন্যান্য অ্যাসেমব্লিতে সংজ্ঞায়িত লোডিং প্রকারের সাথে সহায়তা করবে।
আশা করি এইটি কাজ করবে!
Assembly a
স্বাভাবিক প্রক্রিয়াজাতকরণের প্রতিনিধিত্ব করে যা এই ইভেন্টটিকে আগুনের কারণ হতে পারে। আমি ত্রুটিগুলির a
সাহায্যে কোনও ব্যবহার দেখছি না LoaderException
। আমি কি সঠিক?
আপনি কোনও নেমস্পেসে সমস্ত প্রকার পেতে সক্ষম হবেন না, কারণ একটি নেমস্পেস একাধিক অ্যাসেম্বলিকে ব্রিজ করতে পারে তবে আপনি কোনও অ্যাসেমব্লিতে সমস্ত ক্লাস পেতে পারেন এবং সেগুলি সেই নামের জায়গার সাথে সম্পর্কিত কিনা তা পরীক্ষা করতে পারেন।
Assembly.GetTypes()
স্থানীয় সমাবেশে কাজ করে, বা আপনি প্রথমে কোনও সমাবেশ লোড করতে পারেন তারপরে ফোন GetTypes()
করতে পারেন।
AppDomain.CurrentDomain.GetAssemblies
সহায়ক হতে পারে।
ঠিক যেমন @ কাকু উত্তর, তবে এক্সটেনশন পদ্ধতিগুলি ব্যবহার করে:
string @namespace = "...";
var types = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.IsClass && t.Namespace == @namespace)
.ToList();
types.ForEach(t => Console.WriteLine(t.Name));
মাত্র এক সারিতে নেমস্পেস নামের অংশে সমস্ত ক্লাস পান:
var allClasses = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.IsClass && a.Namespace != null && a.Namespace.Contains(@"..your namespace...")).ToList();
নেমস্পেসগুলি আসলে রানটাইমের ডিজাইনে বরং প্যাসিভ এবং মূলত সাংগঠনিক সরঞ্জাম হিসাবে পরিবেশন করে। .NET- এ টাইপের পুরো নাম নেমস্পেস এবং ক্লাস / এনুম / ইত্যাদি নিয়ে গঠিত। মিলিত। যদি আপনি কেবল একটি নির্দিষ্ট সমাবেশের মধ্য দিয়ে যেতে চান তবে আপনি কেবল সমাবেশ দ্বারা প্রকারভেদগুলি লুপ করবেন। গেট এক্সপোর্টড টাইপস () প্রকারের মান পরীক্ষা করে। নামস্থান । আপনি যদি বর্তমান অ্যাপডোমেনে লোড হওয়া সমস্ত অ্যাসেমব্লির মধ্য দিয়ে যাওয়ার চেষ্টা করছেন তবে এটি অ্যাপডোমাইন.কন্টেনডোমাইন ব্যবহার করে জড়িত। GetAssemblies ()
//a simple combined code snippet
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace MustHaveAttributes
{
class Program
{
static void Main ( string[] args )
{
Console.WriteLine ( " START " );
// what is in the assembly
Assembly a = Assembly.Load ( "MustHaveAttributes" );
Type[] types = a.GetTypes ();
foreach (Type t in types)
{
Console.WriteLine ( "Type is {0}", t );
}
Console.WriteLine (
"{0} types found", types.Length );
#region Linq
//#region Action
//string @namespace = "MustHaveAttributes";
//var q = from t in Assembly.GetExecutingAssembly ().GetTypes ()
// where t.IsClass && t.Namespace == @namespace
// select t;
//q.ToList ().ForEach ( t => Console.WriteLine ( t.Name ) );
//#endregion Action
#endregion
Console.ReadLine ();
Console.WriteLine ( " HIT A KEY TO EXIT " );
Console.WriteLine ( " END " );
}
} //eof Program
class ClassOne
{
} //eof class
class ClassTwo
{
} //eof class
[System.AttributeUsage ( System.AttributeTargets.Class |
System.AttributeTargets.Struct, AllowMultiple = true )]
public class AttributeClass : System.Attribute
{
public string MustHaveDescription { get; set; }
public string MusHaveVersion { get; set; }
public AttributeClass ( string mustHaveDescription, string mustHaveVersion )
{
MustHaveDescription = mustHaveDescription;
MusHaveVersion = mustHaveVersion;
}
} //eof class
} //eof namespace
AttributeClass
নাম কী MustHaveAttributes
সব? কোনও শ্রেণীর বৈশিষ্ট্য আছে কি না তা পরীক্ষার সাথে সম্পর্কিত আমি কিছুই দেখছি না। এটি সহায়তার চেয়ে বিভ্রান্তিকর।
খুবই সাধারণ
Type[] types = Assembly.Load(new AssemblyName("mynamespace.folder")).GetTypes();
foreach (var item in types)
{
}