Добавьте универсальный параметр в свою структуру Event
, а затем используйте этот тип для параметра EventValue
struct Event<T> {
let time: Date
var value: EventValue<T>?
}
, а затем просто инициализируйте EventValue
без указания типа, поскольку компилятор позволяет передавать только значение, соответствующее ограничению общего параметра. А поскольку ваш параметр не имеет ограничений, он равен Any
, поэтому вы можете передать любой тип
let event = Event(time: Date.init(), value: EventValue(value: 40.3467))
За пределами записи C# кодируют для достижения этого, Вы могли использовать XSLT для преобразования XML.
Подобный вышеупомянутому, но обертывание его в дополнительном методе. В моем случае это хорошо работает для меня, поскольку я просто хочу удостовериться, что порядок определенного элемента применяется в моем документе, прежде чем пользователь сохранит xml.
public static class XElementExtensions
{
public static void OrderElements(this XElement parent, params string[] orderedLocalNames)
{
List<string> order = new List<string>(orderedLocalNames);
var orderedNodes = parent.Elements().OrderBy(e => order.IndexOf(e.Name.LocalName) >= 0? order.IndexOf(e.Name.LocalName): Int32.MaxValue);
parent.ReplaceNodes(orderedNodes);
}
}
// using the extension method before persisting xml
this.Root.Element("parentNode").OrderElements("one", "two", "three", "four");
Это должно добиться цели. Это заказывает дочерние узлы корня на основе их содержания, и затем изменяет их порядок в документе. Это вероятно не самый эффективный путь, но оценка по Вашим тегам, Вы хотели видеть его с LINQ.
static void Main(string[] args)
{
XDocument doc = new XDocument(
new XElement("root",
new XElement("one", 1),
new XElement("two", 2)
));
var results = from XElement el in doc.Element("root").Descendants()
orderby el.Value descending
select el;
foreach (var item in results)
Console.WriteLine(item);
doc.Root.ReplaceAll( results.ToArray());
Console.WriteLine(doc);
Console.ReadKey();
}