如何通过从具有类型层次结构的字符串中知道其名称来获取属性值
本文关键字:属性 获取 何通过 类型 字符串 层次结构 | 更新日期: 2023-09-27 18:13:19
我有以下的类层次结构
class firstlevel
{
public secondlevel sl { get; set; }
}
class secondlevel
{
public string Name { get; set; }
}
创建了一个firstlevel对象,名称设置为sandy。var fl =新一级{sl =新二级{Name = "sandy"}};
这是一个例子,我不知道实际场景中的Name,但我知道这个类的层次结构。
我需要写一个方法来获取Name 的值通过阅读很多东西,我写了下面的代码,但令人惊讶的是,它给了我的属性的名字,而不是它的值,我想知道我的代码是什么错了,有人能弄清楚吗。
public static Object GetValue()
{
var fl = new firstlevel { sl = new secondlevel { Name = "sandy" } };
Object obj = fl;
const string path = "fl.sl.Name";
String[] part = path.Split('.');
Type type = obj.GetType();
string firstPart = part[0];
string secondpart = part[1];
string thirdpart = part[2];
PropertyInfo info = type.GetProperty(secondpart);
if (info == null) { return null; }
PropertyInfo info1 = info.GetType().GetProperty(thirdpart);
if (info1 == null) { return null; }
return info1.GetValue(info1, null);
}
这可能行得通
public static Object GetValue()
{
var fl = new firstlevel { sl = new secondlevel { Name = "sandy" } };
Object obj = fl;
const string path = "fl.sl.Name";
String[] part = path.Split('.');
Type type = obj.GetType();
string firstPart = part[0];
string secondpart = part[1];
string thirdpart = part[2];
System.Reflection.PropertyInfo info = type.GetProperty(secondpart);
if (info == null) { return null; }
System.Reflection.PropertyInfo info1 = info.PropertyType.GetProperty(thirdpart);
if (info1 == null) { return null; }
return info1.GetValue(fl.sl, null);
}
我所犯的错误是没有获得内部对象的值(实例)以获得最后一个属性,相反,我直接尝试通过其类型访问它,这是错误的。
正确答案如下:
public static Object GetValue()
{
var fl = new firstlevel { sl = new secondlevel { Name = "imran" } };
Object obj = fl;
const string path = "fl.sl.Name";
var part = path.Split('.');
var type = obj.GetType();
var firstPart = part[0];
var secondpart = part[1];
var thirdpart = part[2];
var info = type.GetProperty(secondpart);
if (info == null) { return null; }
var secondObject = info.GetValue(obj, null);
return secondObject.GetType().GetProperty(thirdpart).GetValue(secondObject);
}
这很好,下面是任何层次结构级别的泛型方法
public static Object GetValueFromClassProperty(String typeHierarichy, Object parentClassObject)
{
foreach (String part in typeHierarichy.Split('.'))
{
if (parentClassObject == null) { return null; }
Type type = parentClassObject.GetType();
PropertyInfo info = type.GetProperty(part);
if (info == null) { return null; }
parentClassObject = info.GetValue(parentClassObject, null);
}
return parentClassObject;
}
Call类似于
string value = GetValueFromClassProperty(fl,"sl.Name");
我还发现了一个很棒的类Reflector,它可以完成所有这些以及更多的功能,并且是开源的