Я написал метод расширения, который получает значение свойства для объекта. Это тот код:
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();
}
Живой пример здесь.
Редактировать:
Метод обратного сеттера выглядел бы очень похожим (я сделал его общим по типу свойства, которое нужно установить):
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;
}