按名称呼叫财产

时间:2013-06-25 19:14:47

标签: c# reflection

我有一个包含超过100个唯一命名属性和20多个子类的类,有时在列表中。下面简要说明了我的意思:

public class classA
    {
        public String PropertyA1 { get; set; }
        public int PropertyA2{get;set;}
        public List<classB> myList;
        public classC myClass { get; set; }

        public void SetProperty(String PropertyName)
        {
            // Match property name to property in this class or child class.
        }
    }

    class classB
    {
        public String PropertyB1 { get; set; }
        public bool PropertyB2 { get; set; }
    }

    class classC
    {
        public String PropertyC1 { get; set; }
    }

我想做两件可能或不可能的事情。我需要做的第一件事是遍历每个公共属性,包括列表中的子类和类的公共属性,并转换值。我知道我可以通过序列化到xml并解析结果来完成解析。我甚至有代码转换为xml,因为类的功能是构建一个xml对象。但是,我担心通过xml解析可能比通过反射访问属性要昂贵得多。可以以这种方式使用反射,并且它比修改xml更快吗?

我想要做的另一件事是访问将属性名称传递给方法的任何属性。我意识到我需要一个单独的方法来访问列表中的类,并且可能必须将列表转换为字典。问题是,这是否可行,代码是否只需要在父类中,或者每个子类是否需要重复代码?

1 个答案:

答案 0 :(得分:10)

将使用给定名称设置属性的方法:

    public void SetProperty(String propertyName, object value)
    {
        this.GetType().GetProperty(propertyName).SetValue(this, value);
    }

有关实施的一些事项:

  • 使用的类型是对象的动态实际类型,它将查找派生类中的成员(只要该对象当然是派生类型)。
  • 属性信息不知道它来自哪个对象,因此this必须再次传递给SetValue()来电。

问题的第二部分,迭代一个属性列表,可以通过使用GetProperties()来获取对象的所有属性,包括继承的属性:

var properties = this.GetType().GetProperties();