অ্যাক্টিভেটর এর উদ্দেশ্য? উদাহরণস্বরূপ ক্রিয়েট ইনস্ট্যান্স?


124

কেউ কি Activator.CreateInstance()বিস্তারিতভাবে উদ্দেশ্য ব্যাখ্যা করতে পারেন ?


6
সম্ভবত যে আরও বেশি ডকুমেন্টেশন এবং উদাহরণ জেনেরিক ওভারলোডগুলিতে উপলব্ধ নেই। আমি উত্সাহিত করব যে ডকুমেন্টেশন ওভারলোডের CreateInstance(Type type)সাথে মিলেছে CreateInstance<T>()
ক্লজ জারজেনসেন

4
এমএসডিএন পৃষ্ঠায় একটি মাত্র ব্যাখ্যামূলক রেখা রয়েছে, "স্থানীয়ভাবে বা দূরবর্তী অবস্থানের ধরণের জিনিস তৈরি করার পদ্ধতি রয়েছে বা বিদ্যমান দূরবর্তী বস্তুগুলির রেফারেন্স পাওয়া যায়। এই শ্রেণিটি উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে না।" msdn.microsoft.com/en-us/library/system.activator.aspx
gonzobrains

2
আপনি এখানে একটি জাভা পটভূমি থেকে এসে থাক তাহলে এই হল c#.netকরছেন প্রণালী Object xyz = Class.forName(className).newInstance();
এসএনএগ

এটা জন্য ভাল ডকুমেন্টেশন এখানে
jpaugh

উত্তর:


149

বলুন যে আপনার MyFancyObjectনীচের মতো একটি ক্লাস রয়েছে :

class MyFancyObject
{
 public int A { get;set;}
}

এটি আপনাকে ঘুরতে দেয়:

String ClassName = "MyFancyObject";

মধ্যে

MyFancyObject obj;

ব্যবহার

obj = (MyFancyObject)Activator.CreateInstance("MyAssembly", ClassName))

এবং তারপরে এমন জিনিসগুলি করতে পারে:

obj.A = 100;

এটাই এর উদ্দেশ্য। এটিতে আরও অনেক ওভারলোড রয়েছে যেমন Typeস্ট্রিংয়ে শ্রেণীর নামের পরিবর্তে সরবরাহ করা providing আপনার কেন এমন সমস্যা হবে তা ভিন্ন গল্প। এখানে কিছু লোক যাদের প্রয়োজন ছিল:


2
এটি আমার পক্ষে কার্যকর প্রমাণিত হয়েছিল। আমার ক্ষেত্রে, ক্লাসটি একটি পৃথক নেমস্পেসে ছিল, সুতরাং আমাকে নিশ্চিত করতে হয়েছিল যে আমি আমার ক্লাসনাম স্ট্রিংয়ের (যেমন String ClassName = "My.Namespace.MyFancyObject";) নামের স্থানটি অন্তর্ভুক্ত করেছি ।
স্কট

1
আপনি আন-র্যাপ () যুক্ত করতে ভুলে গেছেন। আপনি "মায়া অসম্পূর্ণ" এর পরিবর্তে নালাকেও রাখতে পারেন এবং সিস্টেমটি বর্তমান অ্যাসেমব্লিকে অনুসন্ধান করবে।
টনি

1
আমি কি এরকম কিছু করতে পারি obj = (MyFancyObject)Activator.CreateInstance("MyAssembly", ClassName))তবে টাইপের সাথে কাস্টিং না দিয়ে। ক্লাসনেম থেকে তৈরি টাইপের সাথে কাস্ট করবেন? এই মত Type type = Type.GetType(ClassName);obj = (type )Activator.CreateInstance("MyAssembly", ClassName))?
লাঞ্ছনা 26'15

1
উপরেরটি কীভাবে আলাদা: মাইফ্যান্সিওবজেক্ট = নতুন মাইফেন্সিঅবজেক্ট?
এড ল্যান্ডাউ

1
@ এড ল্যান্ডাউ পার্থক্যটি হ'ল আপনি রান সময় কোনও বস্তু ইনস্ট্যান্ট করতে পারেন যা আপনি জানেন না যে এটি সংকলন সময়ে টাইপ করা হয়েছে। উদাহরণস্বরূপ, যদি আপনি আপনার প্রোগ্রামের জন্য একটি প্লাগইন সিস্টেম তৈরি করে যাচ্ছেন। উত্তরের লিঙ্কগুলি আপনাকে কখন মাই ফ্যান্সিঅবজেক্ট ওজেক্ট = নতুন মাইফেন্সিঅবজেক্ট () লিখতে পারবেন না সে সম্পর্কে কিছু ধারণা দিতে পারে। এটি প্রায়শই সাধারণভাবে প্রতিচ্ছবি ব্যবহারের সাথে মিলিত হত। আপনি আরও একটি বর্ণনার জন্য স্ট্যাকওভারফ্লো / প্রশ্ন / 9409293/… পরীক্ষা করে দেখতে পারেন ।
গভীরতর 1

47

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

<Enemy X="10" Y="100" Type="MyGame.OrcGuard"/>

আপনি এখন যা করতে পারেন তা হ'ল আপনার স্তরের ফাইলে পাওয়া বস্তুগুলি গতিশীলভাবে তৈরি করুন।

foreach(XmlNode node in doc)
   var enemy = Activator.CreateInstance(null, node.Attributes["Type"]);

গতিশীল পরিবেশ তৈরির জন্য এটি খুব দরকারী। অবশ্যই এটি প্লাগিন বা সংযুক্ত পরিস্থিতিতে এবং আরও অনেক কিছুতে ব্যবহার করা সম্ভব।


5
আমি বুঝতে পেরেছিলাম যে এটি কোনও প্রকারের একটি নতুন উদাহরণ তৈরি করা হয়েছিল, তবে কেন কেউ এটি করতে চান এটির একটি দুর্দান্ত সাধারণ উদাহরণ।
জ্যামিবারো

14

আমার ভাল বন্ধু এমএসডিএন এটির উদাহরণ দিয়ে আপনাকে ব্যাখ্যা করতে পারে

ভবিষ্যতে লিঙ্ক বা বিষয়বস্তু পরিবর্তনের ক্ষেত্রে কোডটি এখানে রয়েছে:

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

1
এমএসডিএন এর পক্ষে ঘটে যাওয়া অসম্ভব, এবং এখানে লিখিত সামগ্রী অনুলিপি করা প্রায় কপিরাইটের লঙ্ঘন;)
ক্লজ জর্জেনসেন

13
তুমি ঠিক বলছো. ব্যক্তিগতভাবে আমি মনে করি নীতিটি আরও ভাল উত্তর দেওয়ার ক্ষেত্রে কাজ করে। আমি আমার বর্তমান প্রকল্প থেকে প্রায়শই মনে মনে অনেক কিছু নিয়ে আসি। আমি সাধারণত একটি সহজ এবং টু দ্য পয়েন্ট উত্তর চাই, তাই আমি যেখানেই রেখেছি সেখানে চালিয়ে যেতে পারি। আমি নিবন্ধগুলি খুলতে থাকা ঘৃণা করি যা কখনও কখনও অন্য নিবন্ধগুলির সাথে লিঙ্ক করে। অনেক উত্তরদাতারা বুঝতে পারেন না যে অনেক লোক অযৌক্তিক পরিচয় এবং আলাপচারিতার মাধ্যমে বেশ কয়েকটি নিবন্ধের মাধ্যমে এখানে সময় নিয়ে আসে না। সংক্ষিপ্তভাবে একটি ভাল নিবন্ধের গুরুত্বপূর্ণ অংশগুলি সংক্ষিপ্ত করা আমার দেখা সর্বাধিক উত্তরের মূল বিষয়।
জিজ্ঞাসা বি।

10

আপনি এটিও করতে পারেন -

var handle = Activator.CreateInstance("AssemblyName", 
                "Full name of the class including the namespace and class name");
var obj = handle.Unwrap();

আনআর্যাপ () ছিল নিখোঁজ টুকরো। :)
টনি

আমি উপরের 'আনপ্রেপ ()' পদ্ধতিটি ব্যবহার করতে (উপরে হিসাবে) খুঁজে পাচ্ছি না। নতুন। নেট অ্যাপ্লিকেশনগুলিতে কিছু পরিবর্তন হয়েছে?
স্যাম

এটি এখনও সিস্টেম নেমস্পেসে রয়েছে।
উইলিয়াম

2
.Unwrap()সঠিকভাবে কী করে এবং কীভাবে এটি অন্যান্য সমাধানগুলির সাথে সম্পর্কিত, সে সম্পর্কে আপনি কিছু অতিরিক্ত ব্যাখ্যা সরবরাহ করতে পারেন?
জেরোইন ভেনেভেল 10'15

@ স্যাম এটি CreateInstanceযেখানে ফিরে আসে তার একটি আলাদা ওভারলোডে System.Runtime.Remoting.ObjectHandle
নওফাল

9

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

তারপর:

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
বার্কর্ম্ন 01

3

Activator.CreateInstanceপদ্ধতি একটি নির্দিষ্ট টাইপ কন্সট্রাকটর যে শ্রেষ্ঠ নিদিষ্ট পরামিতি সাথে মেলে ব্যবহারের একটি দৃষ্টান্ত সৃষ্টি করে।

উদাহরণস্বরূপ, ধরা যাক যে স্ট্রিং হিসাবে আপনার টাইপের নাম রয়েছে এবং আপনি সেই ধরণের উদাহরণ তৈরি করতে স্ট্রিংটি ব্যবহার করতে চান। আপনি এটির Activator.CreateInstanceজন্য ব্যবহার করতে পারেন :

string objTypeName = "Foo";
Foo foo = (Foo)Activator.CreateInstance(Type.GetType(objTypeName));

এখানে একটি এমএসডিএন নিবন্ধ রয়েছে যা এর প্রয়োগ সম্পর্কে আরও বিস্তারিতভাবে ব্যাখ্যা করে:

http://msdn.microsoft.com/en-us/library/wccyzw83.aspx


5
অথবা আপনি কেবল ব্যবহার করতে পারেন new Foo()। আমি মনে করি ওপি আরও বাস্তববাদী উদাহরণ চেয়েছিল।
কনরাড রুডলফ

1
আমি @ কনরাডের সাথে একমত ব্যবহারের কারণ CreateInstanceহ'ল যদি আপনি নকশার সময় কী ধরনের অবজেক্ট ইনস্ট্যান্ট করতে যাচ্ছেন তা না জানেন। এই উদাহরণে, আপনি স্পষ্টভাবে জানেন যে এটি টাইপ Fooহিসাবে আপনি এটি টাইপ হিসাবে কাস্টিং করছেন Foo। আপনি কখনই এটি করতে পারবেন না কারণ আপনি ঠিক করতে পারেন Foo foo = new Foo()
theyetiman

1

ডিপআই 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);

0

আপনি যদি ইতিমধ্যে ক্লাসটি জানতেন এবং এটি পড়তে যাচ্ছেন তবে আপনি কেন এটি ব্যবহার করবেন? কেন এটি কেবল পুরানো ধাঁচের উপায়ে তৈরি করা হয়নি এবং আপনার মতো বর্গকে সবসময় তৈরি করা যায় না? এটি সাধারণভাবে যেভাবে করা হয় তার কোনও লাভ নেই। পাঠ্যটি নেওয়ার এবং এভাবে চালিত করার কোনও উপায় আছে:

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();

তবে আমি যদি ম্যাজিক পদ্ধতিটি উপস্থিত থাকে তবে এটির একটি বিশাল সুবিধা।


0

প্রতিফলন সঙ্গে মিলিত, আমি দেখেছি বর্ণনা অনুযায়ী Activator.CreateInstance একটি কাস্টম ক্লাসে ম্যাপিং সঞ্চিত পদ্ধতি ফলাফলে খুব সহায়ক হতে নিম্নলিখিত উত্তর

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