获取类中类的属性值
本文关键字:属性 获取 | 更新日期: 2023-09-27 17:56:25
好的,所以我一直在互联网上上下寻找这个问题的解决方案。 我认为我的标题可能没有提供信息,所以一些背景。
我有以下课程:
public class foo { public string Name { get; set; } }
public class foo1 { public string Name { get; set; } }
public class foo2 { public string Name { get; set; } }
public class foo3 { public string Name { get; set; } }
public class foo4 { public string Name { get; set; } }
public class foo5 { public string Name { get; set; } }
public class goo
{
public string Desc { get; set; }
public foo f { get; set; }
public foo1 f1 { get; set; }
public foo2 f2 { get; set; }
public foo3 f3 { get; set; }
public foo4 f4 { get; set; }
}
所以现在我的问题,使用反射,我怎样才能获得foo的价值。仅引用 goo 时的名称。
正常的反射代码是:
goo g = new goo();
PropertyInfo pInfo = g.GetType().GetProperty("Name");
string Name = (string)pInfo.GetValue(g, null);
所以上面的代码是你如何从goo类中获取属性。 但是现在你如何获得foo的价值。舵?
我尝试了以下不起作用的方法:
goo g = new goo();
PropertyInfo pInfo = g.GetType().GetProperty("f");
PropertyInfo pInfo2 = pInfo.PropertyType.GetProperty("Desc");
string Name = (string)pInfo2.GetValue(pInfo.PropertyType, null);
不幸的是,我得到了一个我可以理解的不匹配对象错误,因为我正在尝试使用属性类型而不是 foo 类的实际实例。 我还尝试找到一种从属性信息中实例化对象的方法,但如果有一种方法,那么它就躲开了我。 我可以做这样的事情:
goo g = new goo();
PropertyInfo propInfo = g.GetType().GetProperty("f");
object tmp;
propInfo.SetValue(g, Convert.ChangeType(new foo(), propInfo.PropertyType), null);
tmp = g.f;
这有效,但除了必须对类进行硬编码之外,还创建了一个新实例,因此现在对我来说是用的。
正如我所说,我一直在寻找解决方案。 我发现的所有内容基本上都是"获取类属性的值"主题的变体,但没有更深入的层次。
谁能帮忙? 这甚至可能吗,因为我真的很想远离硬编码。
编辑:我已经编辑了该类,以更准确地表示我正在使用的内容。 根据下面的评论,我从数据库中获取了foo实例的名称,这就是为什么我使用反射或想要使用反射而不是硬编码30 + switch语句的原因。
编辑:在运行时之前我也不知道哪些foo类将填充数据。 此外,每个 foo 类都是不同的。 与每个 foo 类都有一个字符串属性的示例不同,在我的项目中,每个类都有不同的设计来镜像数据库。
编辑:所以Ulugbek Umirov给出了答案。 我只是没有立即看到它。 在我的实现下面,以便将来可能会帮助其他人。
foreach (PropertyInfo pInfo in _standard.GetType().GetProperties())
{
if (_fullDataModel.ClassDefinitions.Contains(pInfo.Name))
{
PropertyInfo _std_pinfo = _standard.GetType().GetProperty(pInfo.Name);
object g = _std_pinfo.GetValue(_standard, null);
PropertyInfo props = g.GetType().GetProperty("showMe");
bool showMe = (bool)props.GetValue(g, null);
if (showMe)
{
string tblName = _fullDataModel.ClassDefinitions[pInfo.Name]. PropertyGroupDefinitions.Where(p => p.TransactionsTable != true).First().Token;
// Use tblName to build up a dataset
}
}
}
这完全符合我的需求。谢谢。
给定您当前的代码,您可以执行以下操作:
goo g = new goo();
g.f = new foo { Name = "Hello" };
PropertyInfo pInfo = g.GetType().GetProperty("f");
object f = pInfo.GetValue(g);
PropertyInfo pInfo2 = f.GetType().GetProperty("Name");
string name = (string)pInfo2.GetValue(f);
您也可以设置任意属性:
goo g = new goo();
PropertyInfo pInfo = g.GetType().GetProperty("f");
object f = Activator.CreateInstance(pInfo.PropertyType);
PropertyInfo pInfo2 = f.GetType().GetProperty("Name");
pInfo2.SetValue(f, "Hello");
pInfo.SetValue(g, f);