C # Reflection: Как получить свойства производного класса из базового класса - PullRequest
1 голос
/ 28 сентября 2010

По сути, я просто хочу получить свойства производного класса с атрибутом [Test] из базового класса.

Вот мой пример кода:

namespace TestConsole
{
    public class BaseClass
    {
        private System.Int64 _id;

        public BaseClass()
        { }

        [Test]
        public System.Int64 ID
        {
            get { return _id;}
            set { _id = value;}
        }

        public System.Xml.XmlNode ToXML()
        { 
            System.Xml.XmlNode xml = null;

            //Process XML here

            return xml;
        }
    }

    public class DerivedClass : BaseClass
    {
        System.String _name;

        public DerivedClass()
        { }

        [Test]
        public System.String Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }

    public class TestConsole
    {
        public static void main()
        {
            DerivedClass derivedClass = new DerivedClass();

            System.Xml.XmlNode xmlNode = derivedClass.ToXML();
        }
    }
}

Я хочу, чтобы xmlNode был примерно таким:

<root>
  <class name="DerivedClass">
    <Field name="Id">
    <Field name="Name">
  </class>
</root>

Спасибо

Ответы [ 2 ]

8 голосов
/ 28 сентября 2010

Вы можете вызвать this.GetType().GetProperties() и GetCustomAttributes() для каждого PropertyInfo, чтобы найти свойства, которые имеют атрибут.

Вам потребуется рекурсивно запустить цикл для проверки свойств базового типа.

2 голосов
/ 28 сентября 2010

Я не думаю, что XmlNode - хороший класс для этой цели.Во-первых, для создания XmlNode требуется, чтобы вы передали ему XmlDocument, что не является хорошим решением .

Во-вторых, атрибуты и значения свойств могут быть извлечены из LINQ, и я думаю,может хорошо интегрироваться с LINQ to XML (и, в частности, XElement класс).

Я написал некоторый код, который делает это:

using System;
using System.Linq;
using System.Xml.Linq;

[AttributeUsage(AttributeTargets.Property)]
class PropertyAttribute : Attribute { }

class BaseClass
{
    [Property]
    public int Id { get; set; }

    IEnumerable<XElement> PropertyValues {
        get {
            return from prop in GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
                   where prop.GetGetMethod () != null
                   let attr = prop.GetCustomAttributes(typeof(PropertyAttribute), false)
                                  .OfType<PropertyAttribute>()
                                  .SingleOrDefault()

                   where attr != null
                   let value = Convert.ToString (prop.GetValue(this, null))

                   select new XElement ("field",
                       new XAttribute ("name", prop.Name),
                       new XAttribute ("value", value ?? "null")
                   );
        }
    }

    public XElement ToXml ()
    {
        return new XElement ("class",
               new XAttribute ("name", GetType ().Name),
               PropertyValues
               );
    }
}

class DerivedClass : BaseClass
{
    [Property]
    public string Name { get; set; }
}

public static class Program
{
    public static void Main()
    {
        var instance = new DerivedClass { Id = 42, Name = "Johnny" };
        Console.WriteLine (instance.ToXml ());
    }
}

Это выводит следующий XML на консоль:

<class name="DerivedClass">
  <field name="Name" value="Johnny" />
  <field name="Id" value="42" />
</class>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...