我有以下两个课程
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)
始终为空。
有没有办法解决这个问题?
答案 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";