Я могу добавить атрибуты к свойству объекта во времени выполнения?

Да! GCC делает это на уровне оптимизации -O1 и выше, а clang делает это на уровне оптимизации -O2 и выше.

Я протестировал его, используя этот код:

struct Matrix5x5 {
    double values[5][5];
    Matrix5x5() : values() {}

    double trace() {
        double sum = 0.0;
        for(int i = 0; i < 5; i++) {
            sum += values[i][i]; 
        }
        return sum; 
    }
};

double trace_of(Matrix5x5& m) {
    return m.trace(); 
}

И это сборка, созданная как gcc, так и clang:

trace_of(Matrix5x5&):
    pxor    xmm0, xmm0
    addsd   xmm0, QWORD PTR [rdi]
    addsd   xmm0, QWORD PTR [rdi+48]
    addsd   xmm0, QWORD PTR [rdi+96]
    addsd   xmm0, QWORD PTR [rdi+144]
    addsd   xmm0, QWORD PTR [rdi+192]
    ret

Вы можете поиграться с кодом и посмотрите соответствующую сборку здесь: https://godbolt.org/z/p2uF0E .

Если вы перегрузите operator[], то вам придется повысить уровень оптимизации до -O3, но компилятор все равно сделает это: https://godbolt.org/z/JInIME [117 ] [+1112]

11
задан Dimitre Novatchev 2 March 2009 в 14:51
поделиться

2 ответа

(редактирование - я неправильно читал исходный вопрос),

Вы не можете добавить фактические атрибуты (они врезаются в IL); однако, с XmlSerializer Вы не имеете к - можно предоставить дополнительные атрибуты в конструкторе к XmlSerializer. Действительно, однако, необходимо немного стараться кэшироваться XmlSerializer экземпляр, если Вы делаете это, как иначе, это создаст дополнительный блок на экземпляр, который является немного текучим. (это не делает этого при использовании простого конструктора, который просто берет a 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; } }
}

Отметьте также; если атрибуты XML были просто иллюстративны, то существует второй способ добавить атрибуты для вещей, связанных с привязкой данных, при помощи TypeDescriptor.CreateProperty и также ICustomTypeDescriptor или TypeDescriptionProvider. Намного более сложный, чем xml случай, я боюсь - и не работаю на весь код - просто кодируют, который использует компонентную модель.

14
ответ дан 3 December 2019 в 07:14
поделиться

Не возможно добавить/удалить атрибуты от класса во времени выполнения.

Возможно однако обновить способ, которым сериализация XML работает во времени выполнения, не будучи должен отредактировать атрибуты. См. сообщение Marc.

Обновленное РЕДАКТИРОВАНИЕ

3
ответ дан 3 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: