আমি রানটাইমের সময় ক্লাসের নাম জানি on এর উপর ভিত্তি করে কোনও শ্রেণীর উদাহরণ তৈরি করার কোনও উপায় আছে কি? মূলত আমার কাছে স্ট্রিংয়ের ক্লাসের নাম থাকবে।
আমি রানটাইমের সময় ক্লাসের নাম জানি on এর উপর ভিত্তি করে কোনও শ্রেণীর উদাহরণ তৈরি করার কোনও উপায় আছে কি? মূলত আমার কাছে স্ট্রিংয়ের ক্লাসের নাম থাকবে।
উত্তর:
কটাক্ষপাত Activator.CreateInstance পদ্ধতি।
var driver = (OpenQA.Selenium.IWebDriver)Activator.CreateInstance("WebDriver", "OpenQA.Selenium.Firefox.FirefoxDriver").Unwrap();
এটি বেশ সহজ। ধরে নিন যে আপনার ক্লাসের নামটি Car
এবং নেমস্পেসটি রয়েছে Vehicles
, তারপরে প্যারামিটারটি পাস করুন Vehicles.Car
যা টাইপের অবজেক্টটি দেয় Car
। এটির মতো আপনি যে কোনও শ্রেণীর যে কোনও উদাহরণ গতিশীলভাবে তৈরি করতে পারেন।
public object GetInstance(string strFullyQualifiedName)
{
Type t = Type.GetType(strFullyQualifiedName);
return Activator.CreateInstance(t);
}
যদি আপনার পুরো যোগ্যতার নাম (যেমন, Vehicles.Car
এই ক্ষেত্রে) অন্য কোনও সমাবেশে থাকে তবে Type.GetType
এটি বাতিল হবে। এই ধরনের ক্ষেত্রে, আপনি সমস্ত অ্যাসেম্বলির মধ্য দিয়ে লুপ পেয়েছেন এবং এটি খুঁজে পান Type
। তার জন্য আপনি নীচের কোডটি ব্যবহার করতে পারেন
public object GetInstance(string strFullyQualifiedName)
{
Type type = Type.GetType(strFullyQualifiedName);
if (type != null)
return Activator.CreateInstance(type);
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
{
type = asm.GetType(strFullyQualifiedName);
if (type != null)
return Activator.CreateInstance(type);
}
return null;
}
এখন আপনি যদি একটি প্যারামিটারাইজড কনস্ট্রাক্টরকে কল করতে চান তবে নিম্নলিখিতটি করুন
Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type
পরিবর্তে
Activator.CreateInstance(t);
dynamic
কোড ব্যবহার না করে এটি হোল্ড করে - দেখুন স্ট্যাকওভারফ্লো.com
strFullyQualifiedName
সঙ্গে str
, fullyQualifiedName
কাজ হবে।
str
ভেরিয়েবলের নামকরণের অংশ হিসাবে ব্যবহৃত হয়। কিছু সংস্থা এবং প্রকল্পগুলি এটি অনুসরণ করার জন্য জোর দেয়, তাই আমি ব্যবহার করেছি। আপনি যদি কিছু নির্দিষ্ট অরগানাইজেশন / প্রকল্পগুলিতে কাজ করে থাকেন তবে আপনি এটি জানতে পারবেন। আপনি যেমনটি str
ছাড়াও বলেছিলেন এটি কাজটি করবে :) :) মেহেদী দেহঘানি
আমি এই পদ্ধতিটি সফলভাবে ব্যবহার করেছি:
System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)
আপনাকে প্রত্যাশিত বস্তুটি আপনার পছন্দসই অবজেক্টের ধরণে ফেলে দিতে হবে।
সম্ভবত আমার প্রশ্নটি আরও নির্দিষ্ট হওয়া উচিত ছিল। আমি আসলে স্ট্রিংয়ের জন্য একটি বেস ক্লাস জানি তাই এটির মাধ্যমে সমাধান করা:
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
অ্যাক্টিভেটর.ক্রিয়েটআইনস্ট্যান্স শ্রেণীর বিভিন্ন পদ্ধতিতে একই জিনিস অর্জনের বিভিন্ন পদ্ধতি রয়েছে। আমি এটি কোনও বস্তুতে ফেলে দিতে পারতাম তবে উপরোক্তটি আমার পরিস্থিতির সর্বাধিক ব্যবহারযোগ্য of
আমি জানি যে আমি খেলায় দেরী করেছি ... তবে আপনি যে সমাধানটি সন্ধান করছেন তা হ'ল উপরের সংমিশ্রণ হতে পারে এবং আপনার অবজেক্টগুলিকে সার্বজনিকভাবে অ্যাক্সেসযোগ্য দিকগুলি সংজ্ঞায়িত করতে একটি ইন্টারফেস ব্যবহার করা যেতে পারে।
তারপরে, আপনার উত্সর্গ করা সমস্ত শ্রেণি যদি এই ইন্টারফেসটি প্রয়োগ করে তবে আপনি কেবল ইন্টারফেসের ধরণ হিসাবে কাস্ট করতে পারেন এবং ফলস্বরূপ অবজেক্টের সাথে কাজ করতে পারেন।
সমাধানে অন্য প্রকল্প থেকে একটি শ্রেণীর উদাহরণ তৈরি করতে, আপনি যে কোনও শ্রেণির (উদাহরণস্বরূপ বেসএন্টিটি) নাম দ্বারা সমাবেশটি নির্দেশিত পেতে এবং একটি নতুন উদাহরণ তৈরি করতে পারেন:
var newClass = System.Reflection.Assembly.GetAssembly(typeof(BaseEntity)).CreateInstance("MyProject.Entities.User");
উদাহরণস্বরূপ, আপনি যদি কোনও ডাটাবেস ক্ষেত্রে বিভিন্ন ধরণের মান সংরক্ষণ করেন (স্ট্রিং হিসাবে সঞ্চিত) এবং নামের সাথে অন্য ক্ষেত্র রয়েছে (যেমন, স্ট্রিং, বুল, ইন্ট, মাই ক্লাস), তবে সেই ক্ষেত্রের ডেটা থেকে, আপনি অনুমেয়, উপরের কোডটি ব্যবহার করে যে কোনও ধরণের শ্রেণি তৈরি করুন এবং এটিকে প্রথম ক্ষেত্রের মান দিয়ে তৈরি করুন। এটি অবশ্যই আপনার ধরণের স্ট্রিংকে সঠিক ধরণের মধ্যে পার্স করার পদ্ধতি নির্ভর করে। আমি এটি একটি ডেটাবেসে ব্যবহারকারীর পছন্দসমূহ সেটিংস সঞ্চয় করতে বহুবার ব্যবহার করেছি।
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
আপনি কেন এই জাতীয় কোড লিখতে চান? আপনার যদি একটি ক্লাস 'রিপোর্টক্লাস' উপলভ্য থাকে তবে আপনি নীচের চিত্রের মতো সরাসরি তা ইনস্ট্যান্ট করতে পারেন।
ReportClass report = new ReportClass();
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
আপনার প্রয়োজনীয় ক্লাস উপলভ্য না থাকলে কোডটি ব্যবহৃত হয় তবে আপনি ইনস্ট্যান্টিয়েট করতে চান বা একটি পদ্ধতি পরিবর্তনশীল করতে চান।
মানে আপনি যখন সমাবেশটি জানেন তখন এটি কার্যকর হয় তবে কোডটি লেখার সময় আপনার ক্লাস ReportClass
উপলব্ধ থাকে না।