সি #: বিধানসভায় সমস্ত শ্রেণীর তালিকা করুন


103

আমি আমার সমাবেশের সমস্ত শ্রেণীর একটি তালিকা আউটপুট (প্রোগ্রামিয়ালি - সি #) করতে চাই।

কোনও ইঙ্গিত বা নমুনা কোড এটি কিভাবে করবেন? প্রতিফলন?


যদি আপনার উদ্দেশ্যটি এমন কোনও অ্যাসেমব্লিকে যা আপনার প্রকল্প দ্বারা রেফারেন্সযুক্ত না পরীক্ষা করা হয়, তবে আমার আপডেট হওয়া উত্তরটি দেখুন।
থোররিন

উত্তর:


152

ব্যবহার Assembly.GetTypes। উদাহরণ স্বরূপ:

Assembly mscorlib = typeof(string).Assembly;
foreach (Type type in mscorlib.GetTypes())
{
    Console.WriteLine(type.FullName);
}

1
বড় সমাবেশগুলির জন্য কোনও পরামর্শ? যখন আমি এই কোডটি 13.8 এমবি সমাবেশের জন্য চালনা করি তখন আমার ভিএস উদাহরণটি অনির্দিষ্টকালের জন্য যা মনে হয় তার জন্য স্তব্ধ হয়ে যায়। আমি একটি ছোট 9 কেবি অ্যাসেম্বলি চেষ্টা করেছি এবং এটি ঠিক কাজ করেছে। আমি জানি আপনি কী ভাবছেন - আপনার কেন 13.8 এমবি সমাবেশ রয়েছে - এটি নেটটিয়ার্স টেম্পলেট ব্যবহার করে উত্পন্ন আমার ডেটা স্তরের অংশ। আমাদের অনেক টেবিল রয়েছে।
ডিসলেক্সিকানবাবোকো

1
@ ডিসলেক্সিকানাবোকো: ঠিক আছে আপনার যদি প্রচুর প্রকারের থাকে তবে সেগুলি সমস্ত গণনা করতে অনেক সময় লাগবে। কত ধরনের হয় যদিও আপনার সমাবেশ? এবং আপনি তাদের সাথে কি করছেন? (আপনি কি নিশ্চিত যে সমস্যাগুলি বের করে নেওয়ার ক্ষেত্রে সমস্যাটি রয়েছে, বা কেবল আপনি যা করছেন তার পরে?)
জন স্কিটি

আমি asm.GetTypes () কলটি পেরিয়ে উঠতে পারি না, এটি কেবল স্তব্ধ হয়ে যায় - এর অর্থ হ'ল স্পষ্টত সত্য যে এখানে প্রচুর প্রকার রয়েছে - আমি কিছুই করতে পারছি না কারণ এটি সমস্ত পাওয়ার চেষ্টা করেই এটি ড্রিল করছে । আমার সিপিইউ আমার 4 টি কোরের একটিতে 30% এ গুলি করেছে। আমি বলতে চাইছি সত্যই আমি কেবল ভাবছি যে যদি বলার উপায় আছে যে, "আরে - কেবল এই নামটির জায়গাগুলিতে দেখুন" - আমি এই ধারণাটির আওতায় আছি যে এটি সম্ভব নয় কারণ গেটটাইপস () পদ্ধতিতে কেবল একটি ফাঁকা নির্মাণকারী রয়েছে। আমি প্রকারের একটি অবজেক্ট ব্রাউজার তৈরি করার চেষ্টা করছি।
ডিসলেক্সিকানবাবোকো

1
ভালো কথা, আমি এখনও চেষ্টা করে দেখিনি। আমার আপাতত আমার কাজটি হ'ল সরাসরি asm.GetType (সম্পূর্ণরূপে QualifiedClassName) ব্যবহার করে ক্লাসগুলিকে টার্গেট করা - যা কাজ করে তবে ব্যবহারকারীকে ক্লাসগুলির একটি তালিকা প্রদর্শন করা সম্ভব নয়, যা আমি চেয়েছিলাম। এটি ক্লায়েন্ট বিটিডব্লিউর মুখোমুখি নয়, আমি এটি নিজের এবং অন্যান্য বিকাশকারীদের জন্য অভ্যন্তরীণভাবে ব্যবহার করছি।
ডিসলেক্সিকানবাবোকো

1
@DebugErr: হ্যাঁ - এটি সহজ যথেষ্ট করতে করতে মাত্র ক্লাস যদি আপনি চান, কিন্তু আমার অনুমান যে ওপি সম্ভবত সত্যিই সব ধরনের চেয়েছিলেন।
জন স্কিটে

102

আমি ঠিক জোনের উদাহরণে যুক্ত করতে চাই। আপনার নিজের সমাবেশে একটি রেফারেন্স পেতে, আপনি এটি ব্যবহার করতে পারেন:

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection নামস্থান।

আপনি যদি এমন কোনও অ্যাসেমবিলি যাচাই করতে চান যেখানে আপনার কোনও রেফারেন্স নেই, আপনি এইগুলির মধ্যে দুটি ব্যবহার করতে পারেন:

Assembly assembly = Assembly.ReflectionOnlyLoad(fullAssemblyName);
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(fileName);

আপনি যদি একবার নিজের ধরণটি খুঁজে পেয়ে থাকেন তবে তা ইনস্ট্যান্ট করতে চান:

Assembly assembly = Assembly.Load(fullAssemblyName);
Assembly assembly = Assembly.LoadFrom(fileName);

দেখুন পরিষদের বর্গ ডকুমেন্টেশন দেখুন।

আপনার কাছে একবার Assemblyঅবজেক্টের রেফারেন্স হয়ে গেলে আপনি assembly.GetTypes()জনের মতো ইতিমধ্যে প্রদর্শিত হিসাবে ব্যবহার করতে পারেন ।


আমার সমাধানে আমি কীভাবে সম্পূর্ণ আলাদা সমাবেশকে উল্লেখ করতে পারি?
অ্যালেক্স

13
সবচেয়ে সহজ উপায় হ'ল যে typeofধরণের পরিচিতিটি আপনি জানেন তা সেই সমাবেশে এবং তারপরে Assemblyসম্পত্তিটি যেমন আমার উদাহরণ হিসাবে রয়েছে।
জন স্কিটি

2
আপনি যদি কোনও অ্যাসেম্বলিটি উল্লেখ করতে চান, তবে abc.dll বলুন, এটি আপনার সমাধানের মধ্যে রয়েছে এবং আপনি যদি সঠিকভাবে dll নামটি হার্ডকোডিং করে থাকেন তবে সমাবেশটি উল্লেখ করার জন্য আরেকটি পদ্ধতি হ'ল: `সমাবেশ সমাবেশ = সমাবেশ L এলওড (" এবিসি ");`
কাশ

এটি কেবলমাত্র বর্তমান সমাবেশটি লোড করে। আমার 4 টি ঘন্টা বা প্রকল্প ব্যবহার করে একটি অ্যাপ্লিকেশন বা এক্সী রয়েছে। আমি কীভাবে এই ঘরের ক্লাসগুলির নাম পেতে পারি?
এর মায়াঙ্ক

@ জোনস্কিট কীভাবে "আধুনিক" সি # পরিবেশে এটি অর্জনযোগ্য হবে? যেমন ইউডাব্লুপি উন্নয়ন করার সময়। ইউডাব্লুপি-র গেটএক্সেকিউটিংএ্যাস্পাবশন () পদ্ধতি নেই।
ড্যানিয়েল আর্মস্ট্রং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.