سؤال

هل من الممكن إضافة سمات في وقت التشغيل أو تغيير قيمة السمة في وقت التشغيل?

هل كانت مفيدة؟

المحلول

سمات ثابتة البيانات الوصفية.الجمعيات, وحدات, أنواع, أعضاء, المعلمات, والعودة القيم ليست كائنات من الدرجة الأولى في C# (على سبيل المثال ، System.Type فئة مجرد يعكس تمثيل من نوع).يمكنك الحصول على مثيل سمة نوع و تغيير خصائص لو انهم للكتابة ولكن ذلك لن تؤثر على السمة كما يتم تطبيقها على نوع.

نصائح أخرى

هذا يعتمد حقا على بالضبط ما كنت تحاول إنجاز.

على النظام.ComponentModel.TypeDescriptor أشياء يمكن استخدامها لإضافة سمات أنواع وخصائص الكائن الحالات ، وأنه لديه الحد الذي يجب عليك استخدامه لاسترداد تلك الخصائص أيضا.إذا كنت تكتب الكود الذي يستهلك تلك الصفات ، و هل يمكن أن يعيش ضمن هذه القيود ، ثم أود أن أقترح بالتأكيد ذلك.

بقدر ما أعرف ، PropertyGrid التحكم visual studio تصميم السطح هي الأشياء الوحيدة في القسم التي تستهلك TypeDescriptor الأشياء.في الواقع, هذا ما يفعلونه عن نصف الأشياء أنها حقا بحاجة إلى القيام به.

لا يمكنك.الحل واحد قد يكون إنشاء فئة مشتقة في وقت التشغيل مع إضافة السمة ، على الرغم من أن هذا هو على الارجح قليلا من مبالغة.

حسنا, مجرد أن تكون مختلفة ، وجدت مقال المراجع باستخدام التفكير.تنبعث منها أن تفعل ذلك.

وهنا الرابط: http://www.codeproject.com/KB/cs/dotnetattributes.aspx سوف تحتاج أيضا إلى النظر في بعض التعليقات في الجزء السفلي من هذه المادة ، لأن النهج الممكنة وتناقش.

لا, ليس.

سمات بيانات التعريف المخزنة في الثنائية في تجميع الجمعية (وهذا هو أيضا السبب يمكنك فقط استخدام أنواع بسيطة في نفوسهم).

لا أعتقد ذلك.حتى لو كنت مخطئا أفضل ما يمكن أن نأمله هو إضافتها إلى كامل نوع أبدا سبيل المثال من نوع.

إذا كنت بحاجة إلى شيء لتكون قادرة على إضافة حيوي, c# سمات ليست الطريق.ننظر إلى تخزين البيانات في xml.أنا فعلت مؤخرا مشروع بدأت w/ الصفات ، ولكن في نهاية المطاف انتقلت إلى التسلسل w/ xml.

لماذا تحتاج إلى ؟ سمات تعطي معلومات إضافية للتفكير, ولكن إذا كنت خارجيا معرفة الخصائص التي تريد أنت لا تحتاج إليها.

هل يمكن تخزين البيانات الوصفية خارجيا بسهولة نسبيا في قاعدة بيانات أو ملف المورد.

حاولت من الصعب جدا مع النظام.ComponentModel.TypeDescriptor دون نجاح.هذا لا يعني أنه لا يمكن العمل ولكن أود أن نرى هذا.

في الجزء مكافحة أردت تغيير بعض قيم السمة.لم 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);
                }
            }
        }

في جافا اعتدت على هذا الأمر من خلال استخدام خريطة وتنفيذ بلدي يأخذ على قيمة مفتاح الترميز.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top