Наличие класса, обеспечивающего XmlElementName по умолчанию
У меня есть набор классов, которые я пытаюсь сериализовать как часть этой спецификации: http://open511.org/root.html
public class Link
{
public Link()
{
}
public Link(string url, string rel = "self")
{
Url = url;
Rel = rel;
}
[XmlAttribute("rel")]
public string Rel { get; set; }
[XmlAttribute("href")]
public string Url { get; set; }
}
а также
public class Service
{
private Link _serviceTypeUrl;
[XmlElement("link")]
public Link ServiceTypeUrl
{
get { return _serviceTypeUrl; }
set
{
_serviceTypeUrl = value;
_serviceTypeUrl.Rel = "service_type";
}
}
[XmlElement("link")]
public Link Url { get; set; }
[XmlArray("supported_versions")]
[XmlArrayItem("supported_version")]
public List<SupportedVersion> SupportedVersions { get; set; }
}
Это не позволит мне иметь два свойства с одним и тем же элементом XMLElement. Есть ли способ сделать это?
Первоначально я хотел бы, чтобы класс ссылки указывал, что всегда нужно использовать имя элемента "ссылка"
2 ответа
Решение
Похоже, что вы пытаетесь достичь не поддерживается. Ваши альтернативы:
- Используйте разные имена элементов для сериализации ваших атрибутов
- Используйте коллекцию для хранения всех ваших
Link
s. В некоторых случаях это усложняет запрос данных, но, я думаю, даст вам нечто похожее на то, что вы хотите.
источники
Вдохновленный ответом FreeAsInBeer, я сохранил их в списке и написал специальную вставку, чтобы предотвратить повторную вставку.
public class Service
{
private List<Link> _links;
[XmlIgnore]
public Link ServiceTypeUrl
{
get { return Links.FirstOrDefault(l => l.Rel == "service_type"); }
set
{
var tempLink = value;
tempLink.Rel = "service_type";
Links.RemoveAll(l => l.Rel == tempLink.Rel); // prevent duplicate rel
Links.Add(tempLink);
}
}
[XmlIgnore]
public Link Url
{
get { return Links.FirstOrDefault(l => l.Rel == "self"); }
set
{
var tempLink = value;
tempLink.Rel = "self";
Links.RemoveAll(l => l.Rel == tempLink.Rel); // prevent duplicate rel
Links.Add(tempLink);
}
}
[XmlElement("link")]
public List<Link> Links
{
get { return _links ?? (_links = new List<Link>()); }
set { _links = value; }
}
[XmlArray("supported_versions")]
[XmlArrayItem("supported_version")]
public List<SupportedVersion> SupportedVersions { get; set; }
}