我编写了一个获取对象属性值的扩展方法。这是代码:
public static string GetValueFromProperty(this object obj, string Name)
{
var prop = obj.GetType().GetProperty(Name);
var propValue = prop != null ? (string)prop.GetValue(obj, null) : string.Empty;
return propValue;
}
它可以很好地处理第一级属性。现在我有个问题。我想获取下拉列表的选定文本我这样调用这个方法:
string s = drp.GetValueFromProperty("SelectedItem.Text");
但是它不返回任何东西。
我如何扩展我的扩展方法,从第二级属性返回值(或在一般形式的任何级别)?
谢谢
您试图找到一个名为SelectedItem.Text
的属性,但该属性在给定对象上不存在(并且永远不会存在,.
是一个保留字符,不能出现在属性名称中)
您可以解析您的输入,通过.
拆分每个方法,并将您的调用一个接一个地链接:
public static string GetValueFromProperty(this object obj, string Name)
{
var methods = Name.Split('.');
object current = obj;
object result = null;
foreach(var method in methods)
{
var prop = current.GetType().GetProperty(method);
result = prop != null ? prop.GetValue(current, null) : null;
current = result;
}
return result == null ? string.Empty : result.ToString();
}
编辑:一个互反setter方法看起来非常相似(我在要设置的属性类型上使其泛型):
public static void SetValueFromProperty<T>(this object obj, string Name, T value)
{
var methods = Name.Split('.');
object current = obj;
object result = null;
PropertyInfo prop = null;
for(int i = 0 ; i < methods.Length - 1 ; ++i)
{
var method = methods[i];
prop = current.GetType().GetProperty(method);
result = prop != null ? prop.GetValue(current, null) : null;
current = result;
}
if(methods.Length > 0)
prop = current.GetType().GetProperty(methods[methods.Length - 1]);
if(null != prop)
prop.SetValue(current, value, null);
}
快速代码(遍历树):
public static string GetValueFromProperty(this object obj, string Name)
{
string[] names = Name.Split('.');
object currentObj = obj;
string value = null;
for (int i = 0; i < names.Length; i++)
{
string name = names[i];
PropertyInfo prop = currentObj.GetType().GetProperty(name);
if (prop == null)
break;
object propValue = prop.GetValue(currentObj, null);
if (propValue == null)
break;
if (i == names.Length - 1)
value = (string)propValue;
else
currentObj = propValue;
}
return value ?? string.Empty;
}