获取嵌套类的属性值始终为null

时间:2016-08-03 06:39:23

标签: c# reflection

我有以下两个课程

public class Family
{
    public string ChildName { get; set; }
}

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Family Child { get; set; }

}

我有一个Employee类的实例如下。

 Employee employee = new Employee();
 employee.Name = "Ram";
 employee.Id = 77;
 employee.Child = new Family() { ChildName = "Lava" };

我有一个方法,它根据属性名称获取属性值,如下所示:

public static object GetPropertyValue(object src, string propName)
{
  string[] nameParts = propName.Split('.');

 if (nameParts.Length == 1)
  {
    return src.GetType().GetRuntimeProperty(propName).GetValue(src, null);
  }

foreach (String part in nameParts)
{
    if (src == null) { return null; }

    Type type = src.GetType();

    PropertyInfo info = type.GetRuntimeProperty(part);

    if (info == null)
    { return null; }

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

在上面的方法中,当我尝试获取嵌套类的属性值时,如

GetPropertyValue(employee, "employee.Child.ChildName")  

GetPropertyValue(GetPropertyValue(employee, "Family"), "ChildName"

不会返回任何值,因为type.GetRuntimeProperty(part)始终为空。

有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:2)

你的问题在于这一行:

foreach (String part in nameParts)

因为你正在遍历nameParts的每一部分,所以你也在迭代" employee",这当然不是一个有效的属性。

尝试以下方法:

foreach (String part in nameParts.Skip(1))

或者调用这样的方法:

GetPropertyValue(employee, "Child.ChildName")

(请注意没有"员工。",因为您已经传入了员工)

答案 1 :(得分:1)

在这种情况下的问题是,当您拆分字符串employee.Child.ChildName时,“员工”是第一部分。但是,employee不是来源的属性,即Employee类。

试试这个:

public class Program
{
    public static void Main()
    {
        Employee employee = new Employee();
        employee.Name = "Ram";
        employee.Id = 77;
        employee.Child = new Family() { ChildName = "Lava" };
        GetPropertyValue(employee, "employee.Child.ChildName");

    }


    public class Family
    {
        public string ChildName { get; set; }
    }

    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public Family Child { get; set; }

    }

    public static object GetPropertyValue(object src, string propName)
    {
        string[] nameParts = propName.Split('.');

        if (nameParts.Length == 1)
        {
            return src.GetType().GetRuntimeProperty(propName).GetValue(src, null);
        }
        nameParts = nameParts.Skip(1).ToArray();
        foreach (String part in nameParts)
        {
            if (src == null) { return null; }

            Type type = src.GetType();

            PropertyInfo info = type.GetRuntimeProperty(part);

            if (info == null)
            { return null; }

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

在这里,我跳过了字符串的第一部分,即“员工”。但是,您可以通过传递Child.ChildName

来解决问题

答案 2 :(得分:-1)

这个问题大约有2年历史了,但是我为您找到了另一个可行的解决方案,这个问题很容易理解。如果在调用calss构造函数中初始化对象,则可以使用dot(。)表示法来分配或读取属性。示例-

public class Family{
    public string ChildName { get; set; }
}

public class Employee{
    public int Id { get; set; }
    public string Name { get; set; }
    public Family Child { get; set; }

    public Employee(){
        Child = new Family();
    }
}

Employee emp = new Employee();
emp.Family.ChildName = "Nested calss attribute value";