একটি স্ট্রিং থেকে একটি শ্রেণীর উদাহরণ তৈরি করুন


218

আমি রানটাইমের সময় ক্লাসের নাম জানি on এর উপর ভিত্তি করে কোনও শ্রেণীর উদাহরণ তৈরি করার কোনও উপায় আছে কি? মূলত আমার কাছে স্ট্রিংয়ের ক্লাসের নাম থাকবে।


আপনি যে সমাধানটি প্রয়োগ করতে চান তা বর্ণনা করেছেন বলে মনে হয়, তবে আপনি যে সমস্যার সমাধান করার চেষ্টা করছেন তা নয়। সম্ভবত আপনি এক্সটেনসিবিলিটি সহ কিছু করার চেষ্টা করছেন, সেই ক্ষেত্রে আমি আপনাকে পরিচালিত এক্সটেনসিবিলিটি ফ্রেমওয়ার্কটি চেক করার পরামর্শ দিচ্ছি ।
জে বাজুজি

উত্তর:


159

কটাক্ষপাত Activator.CreateInstance পদ্ধতি।


15
দুর্দান্ত উদাহরণগুলির সাথে সম্পর্কিত: স্ট্যাকওভারফ্লো.com
জন এস

এছাড়াও আপনার পোস্টটি যেমন খুঁজে পাওয়া দরকার তেমনি এই পোস্টটিও
ব্র্যাড পার্কস


4
উদাহরণস্বরূপ:var driver = (OpenQA.Selenium.IWebDriver)Activator.CreateInstance("WebDriver", "OpenQA.Selenium.Firefox.FirefoxDriver").Unwrap();
এন্ডি তাজাহোনো

2
গুরুত্বপূর্ণ নোটটি এখানে:। রিমোটিং হ্যান্ডেলটি পেরিয়ে আনুন () মুছে ফেলুন যাতে আপনি প্রকৃতপক্ষে কাস্ট করতে পারেন। @ এন্ডি - ধন্যবাদ
রজার উইলককস

77

এটি বেশ সহজ। ধরে নিন যে আপনার ক্লাসের নামটি 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);

Castালাই ছাড়াই এটি কীভাবে ব্যবহার করবেন এবং প্রদত্ত স্ট্রিং থেকে কাস্ট কিভাবে করবেন ??
তাউ

1
@ টাও - কোনও শ্রেণীর উদাহরণ ব্যবহার করার জন্য এটি কী করছে তা সম্পর্কে আপনার কিছুটা জ্ঞান থাকতে হবে - অন্যথায় আপনি এটি ব্যবহার করতে পারবেন না। এর জন্য সর্বাধিক সাধারণ ব্যবহারের কেসটি এমন কিছু ইন্টারফেসে কাস্টিং হবে যা আপনাকে পূর্বনির্ধারিত চুক্তি দেয়। (আপনি dynamicকোড ব্যবহার না করে এটি হোল্ড করে - দেখুন স্ট্যাকওভারফ্লো.com
a

1
এটা নামে পরিবর্তনশীল ধরণ এনকোড না, যেমন:। সেখানে উপসর্গ করার কোন প্রয়োজন নেই strFullyQualifiedNameসঙ্গে str, fullyQualifiedNameকাজ হবে।
মেহেদী দেহঘানি

মূল শব্দটি strভেরিয়েবলের নামকরণের অংশ হিসাবে ব্যবহৃত হয়। কিছু সংস্থা এবং প্রকল্পগুলি এটি অনুসরণ করার জন্য জোর দেয়, তাই আমি ব্যবহার করেছি। আপনি যদি কিছু নির্দিষ্ট অরগানাইজেশন / প্রকল্পগুলিতে কাজ করে থাকেন তবে আপনি এটি জানতে পারবেন। আপনি যেমনটি strছাড়াও বলেছিলেন এটি কাজটি করবে :) :) মেহেদী দেহঘানি
সারথ আনাভু

1
আমি জানি, নামকরণের কনভেনশন সম্পর্কে জানার জন্য কোনও সংস্থায় কাজ করার দরকার নেই যদিও, এই সম্মেলনটি হাঙ্গেরিয়ান স্বরলিপি নামে পরিচিত এবং এটি সেখানে একটি খারাপ ও অবমূল্যায়ন নামকরণ কনভেনশন। বিশেষত সি #
মেহেদী দেহঘানি

55

আমি এই পদ্ধতিটি সফলভাবে ব্যবহার করেছি:

System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)

আপনাকে প্রত্যাশিত বস্তুটি আপনার পছন্দসই অবজেক্টের ধরণে ফেলে দিতে হবে।


9
আমি এমন একটি দৃশ্য কল্পনা করার চেষ্টা করছি যেখানে শ্রেণীর নামের মাধ্যমে অবজেক্টটি তৈরি করা হবে এবং তারপরে এ জাতীয় ধরণটি কোনও অর্থবোধ করতে পারে।
মুসিজেনিসিস

13
আমি বুঝছি তুমি কি বলতে চাও. এটি নিরর্থক বলে মনে হচ্ছে। আপনি যদি শ্রেণীর নাম জানেন তবে আপনার গতিশীল স্ট্রিংয়ের কী দরকার? একটি পরিস্থিতি এমন হতে পারে যে আপনার বেস শ্রেণিতে কাস্টিং এবং স্ট্রিংটি সেই বেস শ্রেণীর বংশধরদের প্রতিনিধিত্ব করে।
রায় লি

4
যদি বেস ক্লাসটি জানা থাকে তবে আপনি বেস ক্লাস বা এর ইন্টারফেসটি প্রতিবিম্ব ছাড়াই বংশধরদের পাস করার যুক্তি হিসাবে ব্যবহার করতে পারেন।
গ্রেট ক্লোবোন

3
দরকারী দৃশ্য: আপনার কেবল সিরিয়ালাইজেশন ইন্টারফেস বা অন্য কোনও সাধারণ প্রচলিত ইন্টারফেসের প্রয়োজন। আপনি এটি ক্লাসে নিক্ষেপ করবেন না, তবে কমপক্ষে কোনও বস্তুর চেয়ে আরও কিছু বেশি করুন
হ্যারাল্ড কোপলস

2
প্রদত্ত স্ট্রিং থেকে কাস্ট কিভাবে করবেন ??
তাউ

23

সম্ভবত আমার প্রশ্নটি আরও নির্দিষ্ট হওয়া উচিত ছিল। আমি আসলে স্ট্রিংয়ের জন্য একটি বেস ক্লাস জানি তাই এটির মাধ্যমে সমাধান করা:

ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));

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


4
প্রশ্ন বিভাগে উত্তর দেওয়ার পরিবর্তে, আমি আপনাকে নিজের প্রশ্ন সম্পাদনা করার এবং পরিবর্তনগুলি নোট করার পরামর্শ দিচ্ছি। এটি করার জন্য আপনি আরও / আরও ভাল উত্তর পাবেন।
জেসন জ্যাকসন

আপনার পক্ষে কাজ করে এমন নির্দিষ্ট রেখার কোড পোস্ট করার জন্য ধন্যবাদ Thanks সমস্ত ক্রিয়েটিইনস্ট্যান্স ওভারলোডগুলি এবং প্রকারগুলি বিভিন্ন ধরণের উত্সের মাধ্যমে বাছাই করাতে আমার অনেক সময় লেগেছিল, যা আপনি আমাকে সংরক্ষণ করেছিলেন।
এথেল ইভান্স

4

আমি জানি যে আমি খেলায় দেরী করেছি ... তবে আপনি যে সমাধানটি সন্ধান করছেন তা হ'ল উপরের সংমিশ্রণ হতে পারে এবং আপনার অবজেক্টগুলিকে সার্বজনিকভাবে অ্যাক্সেসযোগ্য দিকগুলি সংজ্ঞায়িত করতে একটি ইন্টারফেস ব্যবহার করা যেতে পারে।

তারপরে, আপনার উত্সর্গ করা সমস্ত শ্রেণি যদি এই ইন্টারফেসটি প্রয়োগ করে তবে আপনি কেবল ইন্টারফেসের ধরণ হিসাবে কাস্ট করতে পারেন এবং ফলস্বরূপ অবজেক্টের সাথে কাজ করতে পারেন।


4

সমাধানে অন্য প্রকল্প থেকে একটি শ্রেণীর উদাহরণ তৈরি করতে, আপনি যে কোনও শ্রেণির (উদাহরণস্বরূপ বেসএন্টিটি) নাম দ্বারা সমাবেশটি নির্দেশিত পেতে এবং একটি নতুন উদাহরণ তৈরি করতে পারেন:

  var newClass = System.Reflection.Assembly.GetAssembly(typeof(BaseEntity)).CreateInstance("MyProject.Entities.User");

3

উদাহরণস্বরূপ, আপনি যদি কোনও ডাটাবেস ক্ষেত্রে বিভিন্ন ধরণের মান সংরক্ষণ করেন (স্ট্রিং হিসাবে সঞ্চিত) এবং নামের সাথে অন্য ক্ষেত্র রয়েছে (যেমন, স্ট্রিং, বুল, ইন্ট, মাই ক্লাস), তবে সেই ক্ষেত্রের ডেটা থেকে, আপনি অনুমেয়, উপরের কোডটি ব্যবহার করে যে কোনও ধরণের শ্রেণি তৈরি করুন এবং এটিকে প্রথম ক্ষেত্রের মান দিয়ে তৈরি করুন। এটি অবশ্যই আপনার ধরণের স্ট্রিংকে সঠিক ধরণের মধ্যে পার্স করার পদ্ধতি নির্ভর করে। আমি এটি একটি ডেটাবেসে ব্যবহারকারীর পছন্দসমূহ সেটিংস সঞ্চয় করতে বহুবার ব্যবহার করেছি।


-11
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));

আপনি কেন এই জাতীয় কোড লিখতে চান? আপনার যদি একটি ক্লাস 'রিপোর্টক্লাস' উপলভ্য থাকে তবে আপনি নীচের চিত্রের মতো সরাসরি তা ইনস্ট্যান্ট করতে পারেন।

ReportClass report = new ReportClass();

ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));আপনার প্রয়োজনীয় ক্লাস উপলভ্য না থাকলে কোডটি ব্যবহৃত হয় তবে আপনি ইনস্ট্যান্টিয়েট করতে চান বা একটি পদ্ধতি পরিবর্তনশীল করতে চান।

মানে আপনি যখন সমাবেশটি জানেন তখন এটি কার্যকর হয় তবে কোডটি লেখার সময় আপনার ক্লাস ReportClassউপলব্ধ থাকে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.