按名称呼叫财产
我有一个包含100多个唯一命名属性的类和20多个子类,有时在列表中。 以下是我的意思的大大简化的说明:
public class classA { public String PropertyA1 { get; set; } public int PropertyA2{get;set;} public List 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,因为该类的function是构建一个xml对象。 但是,我担心通过xml解析可能比通过reflection访问属性要昂贵得多。 可以以这种方式使用reflection,并且它比修改xml更快吗?
我想要做的另一件事是访问将属性名称传递给方法的任何属性。 我意识到我需要一个单独的方法来访问列表中的类,并且可能必须将列表转换为字典。 问题是,这是否可行,代码是否只需要在父类中,或者每个子类是否需要重复代码?
将使用给定名称设置属性的方法:
public void SetProperty(String propertyName, object value) { this.GetType().GetProperty(propertyName).SetValue(this, value); }
关于实施的一些事项:
- 使用的类型是对象的动态实际类型,它将查找派生类中的成员(只要该对象当然是派生类型)。
- 属性信息不知道它来自哪个对象,因此必须再次传递给
SetValue()
调用。
您可以通过使用GetProperties()
获取对象的所有属性(包括inheritance的属性GetProperties()
来解决问题的第二部分,即迭代属性列表:
var properties = this.GetType().GetProperties();