给定任何对象,我希望能够检索属性的值和任何“深度”。
var name = myObject.GetValue<String>("Name")
或
var father_name = myObject.GetValue<String>("Father.Name")
这很简单,我可以使用以下代码实现它:
public static T GetValue<T>(this Object obj, String fqname)
{
try
{
Object value = obj;
foreach (var prop in fqname.Split('.').Select(s => value.GetType().GetProperty(s)))
{
value = prop.GetValue(value, null);
}
if (value is T)
{
return (T)value;
}
else
{
// if the type requested is not the same as the stored, attempt a blind conversion
var converter = TypeDescriptor.GetConverter(typeof(T));
return (T)converter.ConvertFromInvariantString(value.ToString());
}
}
catch (NotSupportedException)
{
throw new InvalidCastException($"Cannot convert value to reuested type");
}
}
现在问题是这不适用于数组,例如:
var main_street = myObject.GetValue<String>("Addresses[0].StreetName")
甚至没有数组数组的情况等等......
我可以开始将这些条件和特殊情况添加到我的代码中但在此之前我认为,因为C#已经这样做了,也许我们可以利用一些代码解析策略,Roslyn,......不知道,有些东西没有感觉就像重新发明轮子并尽可能多地支持。
有什么想法吗?