ExpandoObject, ডায়নামিকবজেক্ট এবং গতিশীল মধ্যে পার্থক্য Dif


170

মধ্যে পার্থক্য কি কি System.Dynamic.ExpandoObject, System.Dynamic.DynamicObjectএবং dynamic?

কোন পরিস্থিতিতে আপনি এই ধরণের ব্যবহার করেন?

উত্তর:


154

dynamicশব্দ ভেরিয়েবল প্রয়াত-বাউন্ড করা উচিত ডিক্লেয়ার করতে ব্যবহৃত হয়।
যদি আপনি কোনও আসল বা কল্পনাযুক্ত ধরণের জন্য দেরীতে বাইন্ডিং ব্যবহার করতে চান তবে আপনি dynamicকীওয়ার্ডটি ব্যবহার করেন এবং বাকীটি সংকলকটি করেন।

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

IDynamicMetaObjectProviderইন্টারফেস একটি বর্গ তার দেরী আবদ্ধ আচরণ নিয়ন্ত্রণ নিতে পারেন।
আপনি যখন প্রয়োগটির dynamicসাথে ইন্টারঅ্যাক্ট করার জন্য কীওয়ার্ডটি ব্যবহার করেন IDynamicMetaObjectProvider, তখন ডিএলআর IDynamicMetaObjectProviderপদ্ধতিগুলিকে কল করে এবং অবজেক্টটি নিজেই সিদ্ধান্ত নেবে যে কী করা উচিত।

ExpandoObjectএবং DynamicObjectক্লাস বাস্তবায়নের হয় IDynamicMetaObjectProvider

ExpandoObjectএকটি সাধারণ বর্গ যা আপনাকে একটি দৃষ্টান্তে সদস্য যুক্ত করতে এবং তাদের dynamicমিত্রতাকে ব্যবহার করার অনুমতি দেয় ।
DynamicObjectএটি একটি আরও উন্নত বাস্তবায়ন যা সহজেই স্বনির্ধারিত আচরণ প্রদানের জন্য উত্তরাধিকারসূত্রে প্রাপ্ত হতে পারে।


2
এই সম্পর্কে আরও জানার জন্য ভাল জায়গাটি কী হবে? এপিআই নয় তবে এপিআইয়ের পিছনে কেন? উদাহরণস্বরূপ কেন ডায়নামিকবজেক্ট থেকে এক্সপেন্ডোঅবজেক্ট উত্পন্ন হয় না, যা রুবির 'মেথড_মিসিং' ভিত্তিক প্রোগ্রামিংয়ের জন্য ডিফাক্টো বেস প্রকারটি দেখায়।
গিশু

4
আপনি যেখানে ব্যবহারের কয়েকটি উদাহরণ যুক্ত করতে পারেন? উদাহরণস্বরূপ, আমি কীভাবে ডায়নামিকবজেক্টটি ব্যবহার করব এবং এর কী কী সুবিধা রয়েছে?
o

10
এর মতো উদাহরণ ছাড়াই দুর্দান্ত উত্তরগুলি শীর্ষে ক্রিম ছাড়াই কেকের মতো।
তেওমন শিপাহি


68

গতিশীল ExpandoObjectএবং এর মধ্যে পার্থক্য কী তা পরিষ্কার করে বোঝাতে আমি এই প্রশ্নের একটি পরিষ্কার উত্তর দেওয়ার চেষ্টা করব DynamicObject

খুব দ্রুত, dynamicএকটি কীওয়ার্ড। এটি প্রতি-সেয়ে টাইপ নয়। এটি এমন একটি কীওয়ার্ড যা সংকলককে ডিজাইনের সময় স্থির ধরণের চেক উপেক্ষা করতে এবং পরিবর্তে রান-টাইমে দেরি-বাঁধাই ব্যবহার করতে বলে। সুতরাং আমরা dynamicএই উত্তরটির বাকি অংশে খুব বেশি সময় ব্যয় করব না ।

ExpandoObjectএবং DynamicObjectপ্রকৃতপক্ষে প্রকার। সারফেসে, তারা একে অপরের সাথে খুব মিল দেখায়। উভয় শ্রেণি বাস্তবায়ন করে IDynamicMetaObjectProvider। যাইহোক, আরও গভীর খনন করুন এবং আপনি দেখতে পাবেন যে এগুলি মোটেও একই রকম নয়।

ডায়নামিকবজেক্ট হ'ল আংশিক বাস্তবায়ন হ'ল IDynamicMetaObjectProviderবিকাশকারীদের নিজস্ব কাস্টম ধরণের গতিশীল প্রেরণাকে কাস্টম আন্ডারলাইং স্টোরেজ এবং গতিশীল প্রেরণের কাজটি করার জন্য পুনরুদ্ধার আচরণের সাথে ডায়ামিক প্রেরণকে সমর্থন করে বাস্তবায়ন করার জন্য একটি আংশিক বাস্তবায়ন ।

  1. ডায়নামিকবজেক্ট সরাসরি তৈরি করা যায় না।
  2. এটি আপনাকে বিকাশকারী হিসাবে কোনও ব্যবহার করতে ডায়নামিকবজেক্টকে প্রসারিত করতে হবে।
  3. আপনি যখন ডায়নামিকঅবজেক্ট প্রসারিত করেন আপনি রান-টাইমে আপনার অন্তর্নিহিত ডেটা উপস্থাপনায় অভ্যন্তরীণভাবে সঞ্চিত ডেটাতে ডায়নামিক প্রেরণটি কীভাবে সমাধান করতে চান আপনি সে সম্পর্কিত কাস্টম আচরণ প্রদান করতে সক্ষম হবেন।
  4. ডিকশনারী ইত্যাদিতে ইনপ্যান্ডোঅবজেক্টের অন্তর্নিহিত ডেটা ইত্যাদি সঞ্চয় করে থাকে যদি আপনি ডাইনামিকঅবজেক্ট বাস্তবায়ন করেন তবে আপনি যেখানেই এবং আপনার পছন্দ মতো ডেটা সংরক্ষণ করতে পারেন। (যেমন আপনি কীভাবে ডেটা প্রেরণের ডেটা পাবেন এবং সেট করবেন তা সম্পূর্ণ আপনার উপর নির্ভর করে)।

সংক্ষেপে, আপনি যখন আপনার 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
lluchmk

36

সি # ভাষা অনুসারে স্পেসিফিকেশন dynamicএকটি প্রকারের ঘোষণা। অর্থাৎ dynamic xভেরিয়েবলের xটাইপ রয়েছে dynamic

DynamicObjectএটি এমন এক প্রকার যা প্রয়োগ করা সহজ করে IDynamicMetaObjectProviderএবং প্রকারের জন্য নির্দিষ্ট বাঁধাই আচরণকে ওভাররাইড করে।

ExpandoObjectএমন একটি প্রকার যা প্রপার্টি ব্যাগের মতো কাজ করে। অর্থাৎ আপনি রানটাইমের সময় এই ধরণের গতিশীল উদাহরণগুলিতে বৈশিষ্ট্য, পদ্ধতি এবং আরও যোগ করতে পারেন।


25
dynamicপ্রকৃত ধরণের নয় ... সংকলককে এই ভেরিয়েবলের জন্য দেরি বাঁধাই ব্যবহার করতে বলার কেবল ইঙ্গিত। dynamicভেরিয়েবল আসলে হিসেবে ঘোষণা করা হয় objectMSIL মধ্যে
টমাস লেভিসকিউ

1
@ থমাস: সংকলকের দৃষ্টিকোণ থেকে এটি একটি প্রকারের, তবে আপনি ঠিক বলেছেন যে রানটাইম উপস্থাপনাটি অবজেক্টের। বেশ কয়েকটি এমএস উপস্থাপনায় আপনি "স্ট্যাটিকালি টাইপ টাইপড ডাইনামিক" স্টেটমেন্টটি পাবেন।
ব্রায়ান রাসমুসেন

3
@ থমাস: এবং ভাষা অনুচ্ছেদে "সি # 4.0 ডায়ামিক নামে একটি নতুন স্ট্যাটিক প্রকারের পরিচয় করিয়ে দিয়েছে" বলে উল্লেখ করেছে।
ব্রায়ান রাসমুসেন

প্রকৃতপক্ষে ... তবে আমি মনে করি এটি এটিকে একটি ধরণ হিসাবে বিবেচনা করার জন্য বিভ্রান্তিকর, যেহেতু ডায়নামিকবজেক্ট বা এক্সপেন্ডোঅবজেক্টের মতো কোনও উত্তরাধিকারের সম্পর্ক নেই
টমাস

3
@ নাথানআ আমি আপনার সাথে এখানে আছি যাইহোক, ভাষার স্পেসিফিকেশন এটিকে এক ধরণের কল বলে, তাই আমি যা করছি।
ব্রায়ান রাসমুসেন 16

0

উপরের উদাহরণটি DynamicObjectস্পষ্টভাবে পার্থক্যটি জানায় না, কারণ এটি মূলত ইতিমধ্যে সরবরাহ করা কার্যকারিতা বাস্তবায়ন করে ExpandoObject

নীচে উল্লিখিত দুটি লিঙ্কে এটি খুব স্পষ্ট যে এর সহায়তায় DynamicObjectপ্রকৃত প্রকারটি ( XElementনীচের লিঙ্কগুলিতে ব্যবহৃত উদাহরণে) সংরক্ষণ করা / পরিবর্তন করা এবং সম্পত্তি এবং পদ্ধতিগুলির উপর আরও ভাল নিয়ন্ত্রণ করা সম্ভব।

https://blogs.msdn.microsoft.com/csharpfaq/2009/09/30/dynamic-in-c-4-0-introducing-the-expandoobject/

https://blogs.msdn.microsoft.com/csharpfaq/2009/10/19/dynamic-in-c-4-0-creating-wrappers-with-dynamicobject/

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