Попросите пользователя бросить свой iPad с высоты в несколько тысяч футов над землей. Затем используйте внутренний акселерометр, чтобы измерить время, необходимое iPad для достижения конечной скорости. IPad большего размера имеет больший коэффициент сопротивления и должен достигать предельной скорости за меньшее время, чем iPad 111 Mini .
Вот пример кода, с которого можно начать.
function isIPadMini( var timeToReachTerminalVelocity )
{
return (timeToReachTerminalVelocity > IPAD_MINI_THRESHOLD);
}
Вам почти наверняка потребуется пересмотреть этот код, когда Apple неизбежно выпустит следующий iPad в другом форм-факторе. Но я уверен, что вы будете в курсе всех событий и будете поддерживать этот хак для каждой новой версии iPad.
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.
Не могли бы вы использовать конструктор 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" />
Вы, вероятно, знаете об этом, но в качестве идеи (хотя в этом случае структура кода полностью изменится):
Одним из способов было бы сериализовать базовый класс как набор пары имя-значение с использованием настраиваемой сериализации (есть также XDocument и подобные полезные вещи, чтобы упростить задачу). Хотя он не обеспечивает безопасность типов, он избавит вас от большого количества ручной работы.
Я также предпочитаю использовать настраиваемую сериализацию, потому что она предоставляет более широкий диапазон возможностей (например, сериализацию неизменяемых классов). XmlSerializer также иногда действительно неприятен (например, я ненавижу добавлять свойство "MyFieldSpecified" для создания дополнительных атрибутов).
Возможно, вы можете пометить свойство базового класса с помощью общего сопоставления , чем вы переопределяете свойство только в унаследованных классах, где оно должно быть другим. По крайней мере, вы бы сэкономили на переопределении.