সি # তে গতিশীল বৈশিষ্ট্য যুক্ত করা যায়?


143

রানটাইমের সময় অ্যাট্রিবিউট যুক্ত করা বা রানটাইমে কোনও অ্যাট্রিবিটের মান পরিবর্তন করা সম্ভব?

উত্তর:


67

বৈশিষ্ট্যগুলি স্থির মেটাডেটা। সমাবেশগুলি, মডিউলগুলি, প্রকারগুলি, সদস্যরা, পরামিতিগুলি এবং রিটার্ন মানগুলি সি # তে প্রথম-শ্রেণীর অবজেক্ট নয় (উদাঃ System.Typeশ্রেণিটি কেবল কোনও প্রকারের প্রতিফলিত প্রতিনিধিত্ব) is আপনি কোনও প্রকারের জন্য একটি অ্যাট্রিবিউটর উদাহরণ পেতে পারেন এবং বৈশিষ্ট্যগুলি লিখিত হয় তবে পরিবর্তন করতে পারেন তবে এটি টাইপটিতে প্রয়োগ হওয়ার কারণে এটি বৈশিষ্ট্যটিকে প্রভাবিত করবে না।


68

এটি সত্যিকার অর্থে আপনি কী সম্পাদন করতে চাইছেন তার উপর নির্ভর করে।

সিস্টেম.কম্পোনেন্টমোডেলটাইপডেস্কিপ্টর স্টাফগুলি প্রকার, বৈশিষ্ট্য এবং অবজেক্টের দৃষ্টান্তগুলিতে বৈশিষ্ট্য যুক্ত করতে ব্যবহার করা যেতে পারে এবং সেই বৈশিষ্ট্যগুলি পুনরুদ্ধার করতে আপনাকে এটি ব্যবহার করতে হবে এমন সীমাবদ্ধতা রয়েছে। আপনি যদি সেই বৈশিষ্ট্যগুলি গ্রাস করে এমন কোডটি লিখে থাকেন এবং আপনি এই সীমাবদ্ধতার মধ্যে থাকতে পারেন তবে আমি অবশ্যই এটি প্রস্তাব করব suggest

যতদূর আমি জানি, প্রপার্টিগ্রিড নিয়ন্ত্রণ এবং ভিজ্যুয়াল স্টুডিও ডিজাইন পৃষ্ঠটিই ছাত্রলীগের একমাত্র জিনিস যা টাইপডেস্ক্রিপ্টর স্টাফ গ্রহণ করে। আসলে, তারা সত্যই তাদের করা উচিত অর্ধেক কাজ করে things


7
আসলে, অধিকাংশ ডেটা-বাঁধাই ব্যবহারসমূহ TypeDescriptor- শুধু না PropertyGrid
মার্ক Gravell

1
সিলভারলাইট প্রকল্পে সম্পত্তি-মেটাডেটা অ্যাট্রিবিউট যুক্ত করার জন্য কোনও কার্যকারিতা নেই (কোথায় TypeDescriptorএবং TypeDescriptionProviderবাস্তবায়িত হয় না?
শিমি ওয়েটস্যান্ডলার

1
গুরুত্বপূর্ণ লক্ষণীয়, TypeDescriptor.GetAttributes () সদৃশ বৈশিষ্ট্যগুলি পরিচালনা করে না। এটি কেবলমাত্র বৈশিষ্ট্য প্রকারের শেষটি নির্বাচন করে। প্রাক্তন [Attr(1), Attr(2), Attr(3)]কেবল Attr(3)পাওয়া যায়।
ওহুমসাম

11

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


10

ঠিক আছে, কেবল আলাদা হতে, আমি একটি নিবন্ধ পেয়েছি যা প্রতিবিম্ব ব্যবহার করে উল্লেখ করে so এটি করতে প্রেরণ করুন।

এখানে লিঙ্কটি দেওয়া আছে: http://www.codeproject.com/KB/cs/dotnetattributes.aspx , আপনি নিবন্ধের নীচে কিছু মন্তব্যগুলিও দেখতে চাইবেন, কারণ সম্ভাব্য পন্থাগুলি আলোচনা করা হয়েছে।


10
মনে রাখবেন যে আপনি রানটাইমে রিফ্লেকশন.এমিট ক্লাসগুলির সাহায্যে অ্যাট্রিবিউট তৈরি করতে পারেন, তবে আপনি এমিট প্যাকেজটি দিয়ে তৈরি ক্লাসগুলিতে তাদের আবদ্ধ করতে পারেন, বিদ্যমান পদের সাথে নয়।
পানোস

কী বেহুদা উত্তর =)) আমরা সকলেই এখানে বিদ্যমান বর্গ সম্পর্কে যত্নশীল, গতিশীল নয়।
আশাহত

@Hopeless, আপনি উপশ্রেণী পারে YourClassমধ্যে YourRuntimeClassWithAttributes
মোটস

@ আপনার অর্থ কী তা নিশ্চিত নয়, আমার ক্লাসগুলি সমস্ত আগেই সংজ্ঞায়িত হয়েছে, এর অর্থ সমস্ত বেস ক্লাস (যে আমার ক্লাসগুলি উত্তরাধিকারী )ও আগেই সংজ্ঞায়িত / নির্ধারিত হওয়া উচিত। রিফ্লেকশন.ইমিট ব্যবহার করে এটি গতিশীলভাবে তৈরি কোনও কিছুর সাথে জড়িত হওয়ার কোনও উপায় সম্পর্কে ভাবতে পারি না।
আশাহীন

1
@ হ্যাপিলেস, আপনি যদি কোনও বিদ্যমান শ্রেণিতে গতিশীলভাবে গুণাবলী যুক্ত করতে চান YourClass, আপনি রানটাইমের সময় এটিকে সাবক্লাস করতে এবং কিছুটা আলাদা নামের সাথে একটি অভিন্ন শ্রেণি তৈরি করতে পারতেন যা পছন্দসই গতিবেগের সাথে তৈরি বৈশিষ্ট্যও বজায় রাখতে পারে এবং বহুবৈচিত্র্য টাইপ চেকিং কোডটি এখনও সনাক্ত করতে দেয় আপনার বেসক্লাস
মোটস

4

না এইটা না.

বৈশিষ্ট্যগুলি হ'ল মেটা ডেটা এবং সংকলিত অ্যাসেমব্লিতে বাইনারি-ফর্মে সঞ্চিত হয় (এ কারণেই আপনি কেবল সেগুলিতে সাধারণ প্রকারগুলি ব্যবহার করতে পারেন)।


3

আমি বিশ্বাস করি না। আমি ভুল হলেও, আপনি যে সর্বোত্তম আশা করতে পারেন তা হ'ল এগুলি একটি সম্পূর্ণ টাইপটিতে যুক্ত করা, কখনও কোনও প্রকারের উদাহরণ নয়


22
TypeDescriptor.AddAttributes (অবজেক্ট, অ্যাট্রিবিউট []) ক্লাস-লেভেল অ্যাট্রিবিউটগুলি টার্গেটের উপাদানগুলির উদাহরণগুলিতে যুক্ত করে।
পিটার জে

3

গতিশীলভাবে যুক্ত করতে আপনার যদি কিছু প্রয়োজন হয় তবে সি # বৈশিষ্ট্যগুলি উপায় নয়। এক্সএমএলে ডেটা সংরক্ষণ করার জন্য দেখুন। আমি সম্প্রতি একটি প্রকল্প করেছি যা আমি ডাব্লু / বৈশিষ্ট্যগুলি শুরু করেছিলাম, তবে শেষ পর্যন্ত ডাব্লু / এক্সএমএল সিরিয়ালাইজেশনে চলে এসেছি।


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

3

তোমার দরকার কেন? বৈশিষ্ট্যগুলি প্রতিবিম্বের জন্য অতিরিক্ত তথ্য দেয় তবে আপনি যদি বাহ্যিকভাবে জানেন যে কোন বৈশিষ্ট্যগুলি আপনি চান তবে তাদের প্রয়োজন নেই।

আপনি কোনও ডাটাবেস বা রিসোর্স ফাইলে তুলনামূলকভাবে সহজেই মেটা ডেটা সঞ্চয় করতে পারেন।


1
বয়লারপ্লেট নির্মূল। ক্লাসের কোডের উপর ভিত্তি করে যদি কোনও শ্রেণি স্বয়ংক্রিয়ভাবে অ্যাট্রিবিউটস তৈরি করতে পারে তবে এটি কী সহজ হবে না? এসকিউএল সিএলআর অবজেক্টগুলিতে বয়লারপ্লেট হ্রাস করার জন্য আমি এরকম কিছু বের করার চেষ্টা করছি। অন্যান্য ভাষায় সহজ হতে পারে ... পলগ্রহাম.com
ডানকান বায়েন

1

আমি সিস্টেম.কমপোমেনড মডেল.প্রকার সফলতা ছাড়াই টাইপডেস্কিটার দিয়ে খুব চেষ্টা করেছি। এর অর্থ এই নয় যে এটি কাজ করতে পারে না তবে আমি তার জন্য কোড দেখতে চাই।

পাল্টা অংশে, আমি কিছু বৈশিষ্ট্যযুক্ত মান পরিবর্তন করতে চেয়েছিলাম। আমি 2 টি কার্য সম্পাদন করেছি যা সেই উদ্দেশ্যে সূক্ষ্মভাবে কাজ করে।

        // ************************************************************************
        public static void SetObjectPropertyDescription(this Type typeOfObject, string propertyName,  string description)
        {
            PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
            var att = pd.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute;
            if (att != null)
            {
                var fieldDescription = att.GetType().GetField("description", BindingFlags.NonPublic | BindingFlags.Instance);
                if (fieldDescription != null)
                {
                    fieldDescription.SetValue(att, description);
                }
            }
        }

        // ************************************************************************
        public static void SetPropertyAttributReadOnly(this Type typeOfObject, string propertyName, bool isReadOnly)
        {
            PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
            var att = pd.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute;
            if (att != null)
            {
                var fieldDescription = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
                if (fieldDescription != null)
                {
                    fieldDescription.SetValue(att, isReadOnly);
                }
            }
        }

-7

জাভাতে আমি কোনও মানচিত্র ব্যবহার করে এবং কী-ভ্যালু কোডিংয়ের নিজস্ব টেক প্রয়োগ করে এটিকে ঘিরে কাজ করতাম।

http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html


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