গতিশীলভাবে রান টাইমে সি # বৈশিষ্ট্য যুক্ত করুন


89

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

আমি এমন একটি লাইব্রেরি ব্যবহার করছি যা বৈশিষ্ট্যযুক্ত বস্তুগুলির সাথে প্রচুর চতুর জিনিস প্রতিবিম্বের মাধ্যমে কাজ করে। এটি সংজ্ঞায়িত ক্লাসগুলির পাশাপাশি গতিশীল ক্লাসগুলির সাথে কাজ করে। আমাকে এটি আরও এক ধাপ এগিয়ে নিয়ে যেতে হবে এবং এই লাইন ধরে কিছু করতে হবে:

public static object GetDynamicObject(Dictionary<string,object> properties) {
    var myObject = new object();
    foreach (var property in properties) {
        //This next line obviously doesn't work... 
        myObject.AddProperty(property.Key,property.Value);
    }
    return myObject;
}

public void Main() {
    var properties = new Dictionary<string,object>();
    properties.Add("Property1",aCustomClassInstance);
    properties.Add("Property2","TestString2");

    var myObject = GetDynamicObject(properties);

    //Then use them like this (or rather the plug in uses them through reflection)
    var customClass = myObject.Property1;
    var myString = myObject.Property2;

}

লাইব্রেরিটি গতিশীল পরিবর্তনশীল ধরণের সাথে ম্যানুয়ালি বৈশিষ্ট্যযুক্ত বৈশিষ্ট্য সহ কার্যকরভাবে কাজ করে। তবে আমি জানি না আগে কয়টি বা কোন বৈশিষ্ট্য যুক্ত হবে।

উত্তর:


105

আপনি কি এক্সপেন্ডোঅবজেক্টটি একবার দেখেছেন?

দেখা: http://blogs.msdn.com/b/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx

এমএসডিএন থেকে:

ExpandoObject বর্গ আপনাকে রান সময়গুলিতে এর দৃষ্টান্তের সদস্যদের যুক্ত করতে এবং মুছতে এবং এই সদস্যদের মান নির্ধারণ এবং পেতে সক্ষম করে। এই শ্রেণিটি গতিশীল বাঁধাই সমর্থন করে, যা আপনাকে নমুনাঅবজেক্ট.সাম্পেল মেম্বারের মতো স্ট্যান্ডার্ড সিনট্যাক্স যেমন নমুনাবজেক্ট.গেটঅ্যাট্রিবিউট ("স্যাম্পেলমেম্বার") এর মতো আরও জটিল সিনট্যাক্সের পরিবর্তে ব্যবহার করতে সক্ষম করে।

আপনাকে শীতল জিনিসগুলি করার অনুমতি দিচ্ছে:

dynamic dynObject = new ExpandoObject();
dynObject.SomeDynamicProperty = "Hello!";
dynObject.SomeDynamicAction = (msg) =>
    {
        Console.WriteLine(msg);
    };

dynObject.SomeDynamicAction(dynObject.SomeDynamicProperty);

আপনার আসল কোডের ভিত্তিতে আপনি এতে আরও আগ্রহী হতে পারেন:

public static dynamic GetDynamicObject(Dictionary<string, object> properties)
{
    return new MyDynObject(properties);
}

public sealed class MyDynObject : DynamicObject
{
    private readonly Dictionary<string, object> _properties;

    public MyDynObject(Dictionary<string, object> properties)
    {
        _properties = properties;
    }

    public override IEnumerable<string> GetDynamicMemberNames()
    {
        return _properties.Keys;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if (_properties.ContainsKey(binder.Name))
        {
            result = _properties[binder.Name];
            return true;
        }
        else
        {
            result = null;
            return false;
        }
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        if (_properties.ContainsKey(binder.Name))
        {
            _properties[binder.Name] = value;
            return true;
        }
        else
        {
            return false;
        }
    }
}

এইভাবে আপনার কেবল দরকার:

var dyn = GetDynamicObject(new Dictionary<string, object>()
    {
        {"prop1", 12},
    });

Console.WriteLine(dyn.prop1);
dyn.prop1 = 150;

DynamicObject থেকে আহরিত আপনি এই গতিশীল জন সদস্যের অনুরোধ পরিচালনা করার জন্য আপনার নিজের কৌশল সঙ্গে আসা পর্যন্ত করতে পারবেন আছে: হুঁশিয়ার হতে দানব এখানে কম্পাইলার হবে না আপনার গতিশীল কল অনেকটা যাচাই করতে হবে এবং আপনি intellisense পাবেন না, তাই ঠিক রাখা মনে মনে


40

দুর্দান্ত উত্তরের জন্য ক্লিন্টকে ধন্যবাদ:

এক্সপ্যান্ডো অবজেক্টটি ব্যবহার করে এটি সমাধান করা কতটা সহজ ছিল তা হাইলাইট করতে চেয়েছিলেন:

    var dynamicObject = new ExpandoObject() as IDictionary<string, Object>;
    foreach (var property in properties) {
        dynamicObject.Add(property.Key,property.Value);
    }

4

আপনি আপনার জসন স্ট্রিংটিকে একটি অভিধানে ডিসায়ালাইজ করতে পারেন এবং তারপরে নতুন বৈশিষ্ট্য যুক্ত করতে পারেন তবে এটি ক্রমিক করুন।

 var jsonString = @"{}";

        var jsonDoc = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString);

        jsonDoc.Add("Name", "Khurshid Ali");

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