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

Попросите пользователя бросить свой iPad с высоты в несколько тысяч футов над землей. Затем используйте внутренний акселерометр, чтобы измерить время, необходимое iPad для достижения конечной скорости. IPad большего размера имеет больший коэффициент сопротивления и должен достигать предельной скорости за меньшее время, чем iPad 111 Mini .

Вот пример кода, с которого можно начать.

function isIPadMini( var timeToReachTerminalVelocity )
{
    return (timeToReachTerminalVelocity > IPAD_MINI_THRESHOLD);
}

Вам почти наверняка потребуется пересмотреть этот код, когда Apple неизбежно выпустит следующий iPad в другом форм-факторе. Но я уверен, что вы будете в курсе всех событий и будете поддерживать этот хак для каждой новой версии iPad.

8
задан Dave Van den Eynde 24 June 2009 в 12:15
поделиться

4 ответа

I'm going to answer this question myself, so that I can accept this answer. I don't like the answer, but I suppose it's the only valid answer.

The answer is: No, you can't do it.

5
ответ дан 5 December 2019 в 20:18
поделиться

Не могли бы вы использовать конструктор overload XmlSerializer , который позволяет передавать атрибуты для применения во время выполнения? Тогда вам не нужно об этом беспокоиться ...

предостережение: вы хотите кэшировать экземпляр сериализатора и повторно использовать его; в противном случае (со сложными конструкторами) он каждый раз генерирует динамический тип.

Пример:

using System;
using System.Xml.Serialization;
public class Simple {
    public string Value { get; set; }

    static void Main() {
        XmlAttributeOverrides overrides = new XmlAttributeOverrides();
        overrides.Add(typeof(Simple), "Value", new XmlAttributes {
           XmlAttribute = new XmlAttributeAttribute("path")
        });
        XmlSerializer pathSerializer = new XmlSerializer(
            typeof(Simple), overrides);
        // cache and re-use pathSerializer!!!

        Simple obj = new Simple();
        obj.Value = "abc";
        pathSerializer.Serialize(Console.Out, obj);
    }
}

Вывод:

<Simple xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" path="abc" />
2
ответ дан 5 December 2019 в 20:18
поделиться

Вы, вероятно, знаете об этом, но в качестве идеи (хотя в этом случае структура кода полностью изменится):

Одним из способов было бы сериализовать базовый класс как набор пары имя-значение с использованием настраиваемой сериализации (есть также XDocument и подобные полезные вещи, чтобы упростить задачу). Хотя он не обеспечивает безопасность типов, он избавит вас от большого количества ручной работы.

Я также предпочитаю использовать настраиваемую сериализацию, потому что она предоставляет более широкий диапазон возможностей (например, сериализацию неизменяемых классов). XmlSerializer также иногда действительно неприятен (например, я ненавижу добавлять свойство "MyFieldSpecified" для создания дополнительных атрибутов).

0
ответ дан 5 December 2019 в 20:18
поделиться

Возможно, вы можете пометить свойство базового класса с помощью общего сопоставления , чем вы переопределяете свойство только в унаследованных классах, где оно должно быть другим. По крайней мере, вы бы сэкономили на переопределении.

0
ответ дан 5 December 2019 в 20:18
поделиться
Другие вопросы по тегам:

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