我有一个类,它有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更快吗?
我想做的另一件事是访问任何将属性名称传递到方法中的属性。我意识到我需要一个单独的方法来访问列表中的类,并且可能需要将列表转换为字典。问题是,这可能吗?代码只需要在父类中,还是每个子类都需要重复代码?
将使用给定名称设置属性的方法:
public void SetProperty(String propertyName, object value)
{
this.GetType().GetProperty(propertyName).SetValue(this, value);
}
关于实现的几件事:
- 所使用的类型是对象的动态实际类型,它将查找派生类中的成员(当然,只要对象是派生类型)
- 属性信息不知道它来自哪个对象,所以
this
必须再次传递给SetValue()
调用
问题的第二部分,迭代属性列表,可以通过使用GetProperties()
获取对象的所有属性来解决,包括继承的属性:
var properties = this.GetType().GetProperties();