কেউ কি Activator.CreateInstance()
বিস্তারিতভাবে উদ্দেশ্য ব্যাখ্যা করতে পারেন ?
c#.net
করছেন প্রণালী Object xyz = Class.forName(className).newInstance();
।
কেউ কি Activator.CreateInstance()
বিস্তারিতভাবে উদ্দেশ্য ব্যাখ্যা করতে পারেন ?
c#.net
করছেন প্রণালী Object xyz = Class.forName(className).newInstance();
।
উত্তর:
বলুন যে আপনার MyFancyObject
নীচের মতো একটি ক্লাস রয়েছে :
class MyFancyObject
{
public int A { get;set;}
}
এটি আপনাকে ঘুরতে দেয়:
String ClassName = "MyFancyObject";
মধ্যে
MyFancyObject obj;
ব্যবহার
obj = (MyFancyObject)Activator.CreateInstance("MyAssembly", ClassName))
এবং তারপরে এমন জিনিসগুলি করতে পারে:
obj.A = 100;
এটাই এর উদ্দেশ্য। এটিতে আরও অনেক ওভারলোড রয়েছে যেমন Type
স্ট্রিংয়ে শ্রেণীর নামের পরিবর্তে সরবরাহ করা providing আপনার কেন এমন সমস্যা হবে তা ভিন্ন গল্প। এখানে কিছু লোক যাদের প্রয়োজন ছিল:
String ClassName = "My.Namespace.MyFancyObject";
) নামের স্থানটি অন্তর্ভুক্ত করেছি ।
obj = (MyFancyObject)Activator.CreateInstance("MyAssembly", ClassName))
তবে টাইপের সাথে কাস্টিং না দিয়ে। ক্লাসনেম থেকে তৈরি টাইপের সাথে কাস্ট করবেন? এই মত Type type = Type.GetType(ClassName);obj = (type )Activator.CreateInstance("MyAssembly", ClassName))
?
ওয়েল আমি আপনাকে একটি উদাহরণ দিতে পারি কেন কেন এমন কিছু ব্যবহার করা যায়। এমন কোনও গেমের কথা ভাবুন যেখানে আপনি একটি এক্সএমএল ফাইলে আপনার স্তর এবং শত্রুদের সঞ্চয় করতে চান। আপনি যখন এই ফাইলটি বিশ্লেষণ করবেন তখন আপনার মতো উপাদান থাকতে পারে।
<Enemy X="10" Y="100" Type="MyGame.OrcGuard"/>
আপনি এখন যা করতে পারেন তা হ'ল আপনার স্তরের ফাইলে পাওয়া বস্তুগুলি গতিশীলভাবে তৈরি করুন।
foreach(XmlNode node in doc)
var enemy = Activator.CreateInstance(null, node.Attributes["Type"]);
গতিশীল পরিবেশ তৈরির জন্য এটি খুব দরকারী। অবশ্যই এটি প্লাগিন বা সংযুক্ত পরিস্থিতিতে এবং আরও অনেক কিছুতে ব্যবহার করা সম্ভব।
আমার ভাল বন্ধু এমএসডিএন এটির উদাহরণ দিয়ে আপনাকে ব্যাখ্যা করতে পারে
ভবিষ্যতে লিঙ্ক বা বিষয়বস্তু পরিবর্তনের ক্ষেত্রে কোডটি এখানে রয়েছে:
using System;
class DynamicInstanceList
{
private static string instanceSpec = "System.EventArgs;System.Random;" +
"System.Exception;System.Object;System.Version";
public static void Main()
{
string[] instances = instanceSpec.Split(';');
Array instlist = Array.CreateInstance(typeof(object), instances.Length);
object item;
for (int i = 0; i < instances.Length; i++)
{
// create the object from the specification string
Console.WriteLine("Creating instance of: {0}", instances[i]);
item = Activator.CreateInstance(Type.GetType(instances[i]));
instlist.SetValue(item, i);
}
Console.WriteLine("\nObjects and their default values:\n");
foreach (object o in instlist)
{
Console.WriteLine("Type: {0}\nValue: {1}\nHashCode: {2}\n",
o.GetType().FullName, o.ToString(), o.GetHashCode());
}
}
}
// This program will display output similar to the following:
//
// Creating instance of: System.EventArgs
// Creating instance of: System.Random
// Creating instance of: System.Exception
// Creating instance of: System.Object
// Creating instance of: System.Version
//
// Objects and their default values:
//
// Type: System.EventArgs
// Value: System.EventArgs
// HashCode: 46104728
//
// Type: System.Random
// Value: System.Random
// HashCode: 12289376
//
// Type: System.Exception
// Value: System.Exception: Exception of type 'System.Exception' was thrown.
// HashCode: 55530882
//
// Type: System.Object
// Value: System.Object
// HashCode: 30015890
//
// Type: System.Version
// Value: 0.0
// HashCode: 1048575
আপনি এটিও করতে পারেন -
var handle = Activator.CreateInstance("AssemblyName",
"Full name of the class including the namespace and class name");
var obj = handle.Unwrap();
.Unwrap()
সঠিকভাবে কী করে এবং কীভাবে এটি অন্যান্য সমাধানগুলির সাথে সম্পর্কিত, সে সম্পর্কে আপনি কিছু অতিরিক্ত ব্যাখ্যা সরবরাহ করতে পারেন?
CreateInstance
যেখানে ফিরে আসে তার একটি আলাদা ওভারলোডে System.Runtime.Remoting.ObjectHandle
।
এর পরে আরও একটি ভাল উদাহরণ হতে পারে: উদাহরণস্বরূপ আপনার লগারদের একটি সেট রয়েছে এবং আপনি ব্যবহারকারীকে কনফিগারেশন ফাইলের মাধ্যমে রানটাইম ব্যবহার করার জন্য ধরণ নির্দিষ্ট করতে পারবেন।
তারপর:
string rawLoggerType = configurationService.GetLoggerType();
Type loggerType = Type.GetType(rawLoggerType);
ILogger logger = Activator.CreateInstance(loggerType.GetType()) as ILogger;
বা অন্য কেসটি হ'ল যখন আপনার একটি সাধারণ সত্তা কারখানা থাকে, যা সত্তা তৈরি করে, এবং ডিবি থেকে প্রাপ্ত ডেটা দ্বারা কোনও সত্তা সূচনার ক্ষেত্রেও দায়বদ্ধ:
(সুডোকোড)
public TEntity CreateEntityFromDataRow<TEntity>(DataRow row)
where TEntity : IDbEntity, class
{
MethodInfo methodInfo = typeof(T).GetMethod("BuildFromDataRow");
TEntity instance = Activator.CreateInstance(typeof(TEntity)) as TEntity;
return methodInfo.Invoke(instance, new object[] { row } ) as TEntity;
}
typeof(loggerType)
ফলাফলloggerType is a variable and used like a type
Activator.CreateInstance
পদ্ধতি একটি নির্দিষ্ট টাইপ কন্সট্রাকটর যে শ্রেষ্ঠ নিদিষ্ট পরামিতি সাথে মেলে ব্যবহারের একটি দৃষ্টান্ত সৃষ্টি করে।
উদাহরণস্বরূপ, ধরা যাক যে স্ট্রিং হিসাবে আপনার টাইপের নাম রয়েছে এবং আপনি সেই ধরণের উদাহরণ তৈরি করতে স্ট্রিংটি ব্যবহার করতে চান। আপনি এটির Activator.CreateInstance
জন্য ব্যবহার করতে পারেন :
string objTypeName = "Foo";
Foo foo = (Foo)Activator.CreateInstance(Type.GetType(objTypeName));
এখানে একটি এমএসডিএন নিবন্ধ রয়েছে যা এর প্রয়োগ সম্পর্কে আরও বিস্তারিতভাবে ব্যাখ্যা করে:
new Foo()
। আমি মনে করি ওপি আরও বাস্তববাদী উদাহরণ চেয়েছিল।
CreateInstance
হ'ল যদি আপনি নকশার সময় কী ধরনের অবজেক্ট ইনস্ট্যান্ট করতে যাচ্ছেন তা না জানেন। এই উদাহরণে, আপনি স্পষ্টভাবে জানেন যে এটি টাইপ Foo
হিসাবে আপনি এটি টাইপ হিসাবে কাস্টিং করছেন Foo
। আপনি কখনই এটি করতে পারবেন না কারণ আপনি ঠিক করতে পারেন Foo foo = new Foo()
।
ডিপআই 1 এবং এটি বন্ধ করে দেওয়া , এখানে একটি স্ট্রিংয়ে কোনও শ্রেণীর নাম কীভাবে গ্রহণ করা যায় এবং তারপরে এটি লিনকু সহ একটি ডাটাবেসে পড়তে এবং লিখতে ব্যবহার করুন। আমি ডিপি 1 এর কাস্টিংয়ের পরিবর্তে "ডায়নামিক" ব্যবহার করি কারণ এটি আমাকে বৈশিষ্ট্যগুলি অর্পণ করতে দেয়, যা আমাদের গতিশীলরূপে চয়ন করতে এবং আমাদের পছন্দমতো কোনও টেবিল পরিচালনা করতে দেয়।
Type tableType = Assembly.GetExecutingAssembly().GetType("NameSpace.TableName");
ITable itable = dbcontext.GetTable(tableType);
//prints contents of the table
foreach (object y in itable) {
string value = (string)y.GetType().GetProperty("ColumnName").GetValue(y, null);
Console.WriteLine(value);
}
//inserting into a table
dynamic tableClass = Activator.CreateInstance(tableType);
//Alternative to using tableType, using Tony's tips
dynamic tableClass = Activator.CreateInstance(null, "NameSpace.TableName").Unwrap();
tableClass.Word = userParameter;
itable.InsertOnSubmit(tableClass);
dbcontext.SubmitChanges();
//sql equivalent
dbcontext.ExecuteCommand("INSERT INTO [TableNme]([ColumnName]) VALUES ({0})", userParameter);
আপনি যদি ইতিমধ্যে ক্লাসটি জানতেন এবং এটি পড়তে যাচ্ছেন তবে আপনি কেন এটি ব্যবহার করবেন? কেন এটি কেবল পুরানো ধাঁচের উপায়ে তৈরি করা হয়নি এবং আপনার মতো বর্গকে সবসময় তৈরি করা যায় না? এটি সাধারণভাবে যেভাবে করা হয় তার কোনও লাভ নেই। পাঠ্যটি নেওয়ার এবং এভাবে চালিত করার কোনও উপায় আছে:
label1.txt = "Pizza"
Magic(label1.txt) p = new Magic(lablel1.txt)(arg1, arg2, arg3);
p.method1();
p.method2();
যদি আমি ইতিমধ্যে এটির একটি পিজা জানি তবে এর কোনও সুবিধা নেই:
p = (Pizza)somefancyjunk("Pizza"); over
Pizza p = new Pizza();
তবে আমি যদি ম্যাজিক পদ্ধতিটি উপস্থিত থাকে তবে এটির একটি বিশাল সুবিধা।
প্রতিফলন সঙ্গে মিলিত, আমি দেখেছি বর্ণনা অনুযায়ী Activator.CreateInstance একটি কাস্টম ক্লাসে ম্যাপিং সঞ্চিত পদ্ধতি ফলাফলে খুব সহায়ক হতে নিম্নলিখিত উত্তর ।
CreateInstance(Type type)
সাথে মিলেছেCreateInstance<T>()
।