我想知道如何在C#中获取Property的值,但此属性属于另一种类型。
public class Customer
{
public string Name {get; set;}
public string Lastname {get; set;}
public CustomerAddress Address {get; set;}
}
所以我能够获取Name和LastName的属性值,但我完全不了解如何获取CustomerAddress.City的值。
这就是我现在所拥有的。
public object GetPropertyValue(object obj, string property)
{
if (string.IsNullOrEmpty(property))
return new object { };
PropertyInfo propertyInfo = obj.GetType().GetProperty(property);
return propertyInfo.GetValue(obj, null);
}
然后在LINQ语句中使用此方法。
var cells = (from m in model
select new
{
i = GetPropertyValue(m, key),
cell = from c in columns
select reflection.GetPropertyValue(m, c)
}).ToArray();
所以我没有得到CustomerAddress的值。
任何帮助都将深受赞赏。
****更新****
这是我设法做到的。
public object GetNestedPropertyValue(object obj, string property)
{
if (string.IsNullOrEmpty(property))
return string.Empty;
var propertyNames = property.Split('.');
foreach (var p in propertyNames)
{
if (obj == null)
return string.Empty;
Type type = obj.GetType();
PropertyInfo info = type.GetProperty(p);
if (info == null)
return string.Empty;
obj = info.GetValue(obj, null);
}
return obj;
}
答案 0 :(得分:3)
首先,如果你想获得CustomerAddress.City
的价值,你永远不会得到它。 CustomerAddress
是类型,而不是属性名称。你想获得Address.City
。
尽管如此,您的GetPropertyValue
并未设置为执行您想要的操作。
尝试按点分割名称:
var propertyNames = property.split('.');
现在,您有一个属性名称{"Address", "City"}
然后,您可以逐个遍历这些属性名称,递归调用GetPropertyValue
。
应该这样做:)
答案 1 :(得分:0)
@Michael - >倒置部分; - )
public static void SetNestedPropertyValue(object obj, string property,object value)
{
if (obj == null)
throw new ArgumentNullException("obj");
if (string.IsNullOrEmpty(property))
throw new ArgumentNullException("property");
var propertyNames = property.Split('.');
foreach (var p in propertyNames)
{
Type type = obj.GetType();
PropertyInfo info = type.GetProperty(p);
if (info != null)
{
info.SetValue(obj, value);
return;
}
}
throw new KeyNotFoundException("Nested property could not be found.");
}