Определите правила сериализации XML, указанные в классе - PullRequest
0 голосов
/ 30 августа 2011

Можно ли сделать следующее:

Создайте экземпляр SomeCLass в другой части моего кода И
Используя этот вновь созданный экземпляр / объект, я могу получить:

[System.Xml.Serialization.XmlElementAttribute ( "SomeClass")] Правило XML-сериализации

Что я пытаюсь достичь:
1. Определите, содержит ли SomeCLass правило сериализации XML для какого-либо свойства
2. Если оно содержит такое правило сериализации, идентифицирует правило .
(т. е. является ли ... XMLIgnore || XMLElement || XMLAttribute ... и т. Класс, указанный в вопросе: Class SomeClass { SomeOtherClass[] privtArr; [System.Xml.Serialization.XmlElementAttribute("SomeOtherClass")] public SomeOtherClass[] anInstance { get { return this.privtArr; } set { this.privtArr = value; } } }

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Вам не нужно создавать экземпляр;просто посмотрите на Type, в частности GetFields() и GetProperties().Цикл по открытым нестатическим полям / свойствам и проверка Attribute.GetCustomAttribute(member, attributeType) - т.е.

public class Test
{
    [XmlElement("abc")]
    public int Foo { get; set; }
    [XmlIgnore]
    public string Bar { get; set; }

    static void Main()
    {
        var props = typeof (Test).GetProperties(
              BindingFlags.Public | BindingFlags.Instance);
        foreach(var prop in props)
        {
            if(Attribute.IsDefined(prop, typeof(XmlIgnoreAttribute)))
            {
                Console.WriteLine("Ignore: " + prop.Name);
                continue; // it is ignored; stop there
            }
            var el = (XmlElementAttribute) Attribute.GetCustomAttribute(
                   prop, typeof (XmlElementAttribute));
            if(el != null)
            {
                Console.WriteLine("Element: " + (
                  string.IsNullOrEmpty(el.ElementName) ?
                  prop.Name : el.ElementName));
            }
            // todo: repeat for other interesting attributes; XmlAttribute,
            // XmlArrayItem, XmlInclude, etc...
        }
    }
}

Если вам нужно создать экземпляр, используйте1012 * или Activator.CreateInstance.

1 голос
/ 30 августа 2011

Вам даже не нужно создавать экземпляр SomeClass.

использовать Reflection для перечисления (открытых) полей и свойств typeof(SomeClass).Затем для каждого поля / свойства перечислите атрибуты и отфильтруйте те, которые вас интересуют (например, XmlElement(), XmlAttribute(), ...

. Обратите внимание, что XmlSerializer сериализует открытые поля и свойстваесли они не имеют атрибута XmlBlah. Они сериализуются, если они не помечены как [XmlIgnore()]. Затем вам следует поискать и этот атрибут.

Конечно, вас также могут заинтересовать атрибуты Xmlна уровне класса.

...