一尘不染

在C#中使用反射获取嵌套对象的属性

c#

给定以下对象:

public class Customer {
    public String Name { get; set; }
    public String Address { get; set; }
}

public class Invoice {
    public String ID { get; set; }
    public DateTime Date { get; set; }
    public Customer BillTo { get; set; }
}

我想使用反射Invoice来获取的Name属性Customer。这是我想要的,假设这段代码可以工作:

Invoice inv = GetDesiredInvoice();  // magic method to get an invoice
PropertyInfo info = inv.GetType().GetProperty("BillTo.Address");
Object val = info.GetValue(inv, null);

当然,这会失败,因为“ BillTo.Address”不是Invoice该类的有效属性。

因此,我尝试编写一种方法,将句点上的字符串分割成多个部分,然后遍历对象以查找我感兴趣的最终值。它可以正常工作,但我对此并不完全满意:

public Object GetPropValue(String name, Object obj) {
    foreach (String part in name.Split('.')) {
        if (obj == null) { return null; }

        Type type = obj.GetType();
        PropertyInfo info = type.GetProperty(part);
        if (info == null) { return null; }

        obj = info.GetValue(obj, null);
    }
    return obj;
}

关于如何改进此方法或解决此问题的更好方法的任何想法?

*发布后进行 *编辑 ,我看到了一些相关的帖子…但是,似乎没有专门解决此问题的答案。另外,我仍然希望获得有关实施的反馈。


阅读 779

收藏
2020-05-19

共1个答案

一尘不染

我实际上认为您的逻辑很好。就个人而言,我可能会更改它,以便您将对象作为第一个参数传递(它与PropertyInfo.GetValue更加内联,因此不足为奇)。

我还可能将其更像GetNestedPropertyValue,以使其明显地搜索属性堆栈。

2020-05-19