هل يمكنني إضافة سمات إلى خاصية كائن في وقت التشغيل؟

StackOverflow https://stackoverflow.com/questions/602384

  •  03-07-2019
  •  | 
  •  

سؤال

على سبيل المثال، أريد إزالة أو تغيير سمات الخاصية أدناه أو إضافة سمات جديدة.هل هو ممكن؟

[XmlElement("bill_info")]
[XmlIgnore]
public BillInfo BillInfo
{
  get { return billInfo; }
  set { billInfo = value; }
}
هل كانت مفيدة؟

المحلول

و(تحرير - أنا أخطأت السؤال الأصلي)

ولا يمكنك إضافة سمات الفعلية (وفيحترق إلى IL)؛ ومع ذلك، مع XmlSerializer لم يكن لديك ل- يمكنك تزويد سمات إضافية في منشئ إلى XmlSerializer. قمت بذلك، ومع ذلك، تحتاج إلى أن يكون حذرا قليلا إلى ذاكرة التخزين المؤقت المثال XmlSerializer إذا قمت بذلك، وإلا فإنه سيتم إنشاء تجميع إضافي لكل مثيل، وهو راشح قليلا. (لا تفعل هذا إذا كنت تستخدم منشئ بسيط هو أن يستغرق سوى Type). انظروا XmlAttributeOverrides .

لمثال:

using System;
using System.Xml.Serialization;
 public class Person
{
    static void Main()
    {
        XmlAttributeOverrides overrides = new XmlAttributeOverrides();
        XmlAttributes attribs = new XmlAttributes();
        attribs.XmlIgnore = false;
        attribs.XmlElements.Add(new XmlElementAttribute("personName"));
        overrides.Add(typeof(Person), "Name", attribs);

        XmlSerializer ser = new XmlSerializer(typeof(Person), overrides);
        Person person = new Person();
        person.Name = "Marc";
        ser.Serialize(Console.Out, person);
    }
    private string name;
    [XmlElement("name")]
    [XmlIgnore]
    public string Name { get { return name; } set { name = value; } }
}

ملحوظة أيضا. إذا كانت سمات أكس مجرد التوضيح، ثم هناك <م> الثانية طريقة لإضافة سمات الأشياء التي تتعلق البيانات ملزم، وذلك باستخدام TypeDescriptor.CreateProperty وإما ICustomTypeDescriptor أو TypeDescriptionProvider. كثيرا أكثر تعقيدا مما كان عليه الحال أكس، وأخشى - ولا يعمل لكافة التعليمات البرمجية - مجرد رمز يستخدم المكون من طراز

نصائح أخرى

ليس من الممكن إضافة/إزالة السمات من فئة في وقت التشغيل.

ومع ذلك، من الممكن تحديث الطريقة التي يعمل بها تسلسل XML في وقت التشغيل دون الحاجة إلى تعديل السمات.انظر مشاركة مارك.

يحرر محدث

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