উত্তর:
dynamicশব্দ ভেরিয়েবল প্রয়াত-বাউন্ড করা উচিত ডিক্লেয়ার করতে ব্যবহৃত হয়।
যদি আপনি কোনও আসল বা কল্পনাযুক্ত ধরণের জন্য দেরীতে বাইন্ডিং ব্যবহার করতে চান তবে আপনি dynamicকীওয়ার্ডটি ব্যবহার করেন এবং বাকীটি সংকলকটি করেন।
আপনি যখন dynamicকোনও সাধারণ উদাহরণের সাথে ইন্টারঅ্যাক্ট করার জন্য কীওয়ার্ডটি ব্যবহার করেন , তখন ডিএলআর দৃষ্টান্তের স্বাভাবিক পদ্ধতিগুলিতে দেরিতে আবদ্ধ কলগুলি করে।
IDynamicMetaObjectProviderইন্টারফেস একটি বর্গ তার দেরী আবদ্ধ আচরণ নিয়ন্ত্রণ নিতে পারেন।
আপনি যখন প্রয়োগটির dynamicসাথে ইন্টারঅ্যাক্ট করার জন্য কীওয়ার্ডটি ব্যবহার করেন IDynamicMetaObjectProvider, তখন ডিএলআর IDynamicMetaObjectProviderপদ্ধতিগুলিকে কল করে এবং অবজেক্টটি নিজেই সিদ্ধান্ত নেবে যে কী করা উচিত।
ExpandoObjectএবং DynamicObjectক্লাস বাস্তবায়নের হয় IDynamicMetaObjectProvider।
ExpandoObjectএকটি সাধারণ বর্গ যা আপনাকে একটি দৃষ্টান্তে সদস্য যুক্ত করতে এবং তাদের dynamicমিত্রতাকে ব্যবহার করার অনুমতি দেয় ।
DynamicObjectএটি একটি আরও উন্নত বাস্তবায়ন যা সহজেই স্বনির্ধারিত আচরণ প্রদানের জন্য উত্তরাধিকারসূত্রে প্রাপ্ত হতে পারে।
গতিশীল ExpandoObjectএবং এর মধ্যে পার্থক্য কী তা পরিষ্কার করে বোঝাতে আমি এই প্রশ্নের একটি পরিষ্কার উত্তর দেওয়ার চেষ্টা করব DynamicObject।
খুব দ্রুত, dynamicএকটি কীওয়ার্ড। এটি প্রতি-সেয়ে টাইপ নয়। এটি এমন একটি কীওয়ার্ড যা সংকলককে ডিজাইনের সময় স্থির ধরণের চেক উপেক্ষা করতে এবং পরিবর্তে রান-টাইমে দেরি-বাঁধাই ব্যবহার করতে বলে। সুতরাং আমরা dynamicএই উত্তরটির বাকি অংশে খুব বেশি সময় ব্যয় করব না ।
ExpandoObjectএবং DynamicObjectপ্রকৃতপক্ষে প্রকার। সারফেসে, তারা একে অপরের সাথে খুব মিল দেখায়। উভয় শ্রেণি বাস্তবায়ন করে IDynamicMetaObjectProvider। যাইহোক, আরও গভীর খনন করুন এবং আপনি দেখতে পাবেন যে এগুলি মোটেও একই রকম নয়।
ডায়নামিকবজেক্ট হ'ল আংশিক বাস্তবায়ন হ'ল IDynamicMetaObjectProviderবিকাশকারীদের নিজস্ব কাস্টম ধরণের গতিশীল প্রেরণাকে কাস্টম আন্ডারলাইং স্টোরেজ এবং গতিশীল প্রেরণের কাজটি করার জন্য পুনরুদ্ধার আচরণের সাথে ডায়ামিক প্রেরণকে সমর্থন করে বাস্তবায়ন করার জন্য একটি আংশিক বাস্তবায়ন ।
সংক্ষেপে, আপনি যখন আপনার OWN ধরণের তৈরি করতে চান যা DLR এর সাথে ব্যবহার করা যায় এবং আপনার পছন্দসই CUSTOM আচরণের সাথে কাজ করতে চান তখন ডায়নামিকঅবজেক্টটি ব্যবহার করুন।
উদাহরণ: কল্পনা করুন যে আপনি এমন একটি ডায়নামিক টাইপ রাখতে চান যা যখনই উপস্থিত নেই এমন সদস্যের উপর যখন চেষ্টা করার চেষ্টা করা হয় তখনই তারা একটি কাস্টম ডিফল্ট ফিরিয়ে দেয় (অর্থাত্ চালুর সময় যোগ করা হয়নি)। এবং এটি ডিফল্ট বলবে, "আমি দুঃখিত, এই বয়ামে কোনও কুকিজ নেই!"! আপনি যদি এমন একটি গতিশীল অবজেক্ট চান যা এইরকম আচরণ করে, আপনি যখন ক্ষেত্র খুঁজে না পাওয়া যায় তখন কী হবে তা আপনাকে নিয়ন্ত্রণ করতে হবে। ExpandoObject আপনাকে এটি করতে দেবে না। সুতরাং আপনাকে অনন্য গতিশীল সদস্য রেজোলিউশন (প্রেরণ) আচরণের সাথে আপনার নিজস্ব ধরণের তৈরি করতে হবে এবং এটি তৈরির পরিবর্তে ব্যবহার করতে হবেExpandoObject ।
আপনি নিম্নরূপ একটি প্রকার তৈরি করতে পারেন: (দ্রষ্টব্য, নীচের কোডটি কেবল উদাহরণের জন্য এবং এটি চলতে পারে না D ডায়নামিকঅবজেক্টকে কীভাবে সঠিকভাবে ব্যবহার করতে হয় সে সম্পর্কে অন্যান্য কোথাও অনেক নিবন্ধ এবং টিউটোরিয়াল রয়েছে))
public class MyNoCookiesInTheJarDynamicObject : DynamicObject
{
Dictionary<string, object> properties = new Dictionary<string, object>();
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
if (properties.ContainsKey(binder.Name))
{
result = properties[binder.Name];
return true;
}
else
{
result = "I'm sorry, there are no cookies in this jar!"; //<-- THIS IS OUR
CUSTOM "NO COOKIES IN THE JAR" RESPONSE FROM OUR DYNAMIC TYPE WHEN AN UNKNOWN FIELD IS ACCESSED
return false;
}
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
properties[binder.Name] = value;
return true;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
dynamic method = properties[binder.Name];
result = method(args[0].ToString(), args[1].ToString());
return true;
}
}
এখন, আমরা কেবলমাত্র একটি গতিশীল প্রকার হিসাবে তৈরি এই কল্পিত শ্রেণির ব্যবহার করতে পারি যা ক্ষেত্রটির অস্তিত্ব না থাকলে খুব কাস্টম আচরণ করে।
dynamic d = new MyNoCookiesInTheJarDynamicObject();
var s = d.FieldThatDoesntExist;
//in our contrived example, the below should evaluate to true
Assert.IsTrue(s == "I'm sorry, there are no cookies in this jar!")
ExpandoObjectIDynamicMetaObjectProvider.NET ফ্রেমওয়ার্ক টিম আপনার জন্য এই সমস্ত সিদ্ধান্ত নিয়েছে এমন একটি সম্পূর্ণ বাস্তবায়ন । আপনার যদি কোনও কাস্টম আচরণের প্রয়োজন না হয় তবে এটি কার্যকর হয় এবং আপনি মনে করেন যে এক্সপান্ডোঅবজেক্ট আপনার জন্য যথেষ্ট ভাল কাজ করে (90% সময়, ExpandoObjectযথেষ্ট ভাল)। সুতরাং উদাহরণস্বরূপ, নিম্নলিখিতটি দেখুন এবং এটি এক্সপেন্ডোঅবজেক্টের জন্য, যদি গতিশীল সদস্যের অস্তিত্ব না থাকে তবে ডিজাইনাররা একটি ব্যতিক্রম ছুঁড়ে ফেলতে পছন্দ করে।
dynamic d = new ExpandoObject();
/*
The ExpandoObject designers chose that this operation should result in an
Exception. They did not have to make that choice, null could
have been returned, for example; or the designers could've returned a "sorry no cookies in the jar" response like in our custom class. However, if you choose to use
ExpandoObject, you have chosen to go with their particular implementation
of DynamicObject behavior.
*/
try {
var s = d.FieldThatDoesntExist;
}
catch(RuntimeBinderException) { ... }
সুতরাং সংক্ষেপে বলা যায়, ExpandoObjectডায়নামিকবজেক্টকে নির্দিষ্ট গতিশীল প্রেরণের আচরণের সাথে প্রসারিত করার জন্য কেবল একটি প্রাক-বাছাই করা উপায় যা সম্ভবত আপনার পক্ষে কাজ করবে তবে আপনার বিশেষ প্রয়োজনের উপর নির্ভর করে না।
অন্যদিকে, DyanmicObjectএকটি সহায়ক বেসটাইপ যা অনন্য গতিশীল আচরণগুলির সাথে আপনার নিজস্ব প্রকারগুলি কার্যকর এবং সহজ করে তোলে।
উপরের উদাহরণ উত্সটির উপর ভিত্তি করে একটি দরকারী টিউটোরিয়াল।
DynamicObject: ওভাররাইড করার সময় TryGetMember, আপনি যদি মিথ্যা ফেরান একটি RuntimeBinderExceptionঅ-বিদ্যমান সম্পত্তি অ্যাক্সেস করার চেষ্টা করার সময় নিক্ষেপ করা হবে। স্নিপেটটি আসলে কাজ করার জন্য আপনার ফিরে আসা উচিত true।
সি # ভাষা অনুসারে স্পেসিফিকেশন dynamicএকটি প্রকারের ঘোষণা। অর্থাৎ dynamic xভেরিয়েবলের xটাইপ রয়েছে dynamic।
DynamicObjectএটি এমন এক প্রকার যা প্রয়োগ করা সহজ করে IDynamicMetaObjectProviderএবং প্রকারের জন্য নির্দিষ্ট বাঁধাই আচরণকে ওভাররাইড করে।
ExpandoObjectএমন একটি প্রকার যা প্রপার্টি ব্যাগের মতো কাজ করে। অর্থাৎ আপনি রানটাইমের সময় এই ধরণের গতিশীল উদাহরণগুলিতে বৈশিষ্ট্য, পদ্ধতি এবং আরও যোগ করতে পারেন।
dynamicপ্রকৃত ধরণের নয় ... সংকলককে এই ভেরিয়েবলের জন্য দেরি বাঁধাই ব্যবহার করতে বলার কেবল ইঙ্গিত। dynamicভেরিয়েবল আসলে হিসেবে ঘোষণা করা হয় objectMSIL মধ্যে
উপরের উদাহরণটি DynamicObjectস্পষ্টভাবে পার্থক্যটি জানায় না, কারণ এটি মূলত ইতিমধ্যে সরবরাহ করা কার্যকারিতা বাস্তবায়ন করে ExpandoObject।
নীচে উল্লিখিত দুটি লিঙ্কে এটি খুব স্পষ্ট যে এর সহায়তায় DynamicObjectপ্রকৃত প্রকারটি ( XElementনীচের লিঙ্কগুলিতে ব্যবহৃত উদাহরণে) সংরক্ষণ করা / পরিবর্তন করা এবং সম্পত্তি এবং পদ্ধতিগুলির উপর আরও ভাল নিয়ন্ত্রণ করা সম্ভব।
public class DynamicXMLNode : DynamicObject
{
XElement node;
public DynamicXMLNode(XElement node)
{
this.node = node;
}
public DynamicXMLNode()
{
}
public DynamicXMLNode(String name)
{
node = new XElement(name);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
XElement setNode = node.Element(binder.Name);
if (setNode != null)
setNode.SetValue(value);
else
{
if (value.GetType() == typeof(DynamicXMLNode))
node.Add(new XElement(binder.Name));
else
node.Add(new XElement(binder.Name, value));
}
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
XElement getNode = node.Element(binder.Name);
if (getNode != null)
{
result = new DynamicXMLNode(getNode);
return true;
}
else
{
result = null;
return false;
}
}
}