我有一个由多个其他类组成的类。
class X
{
public string str;
}
class Y
{
public X x;
}
现在我知道使用反射可以获得直接成员的值,class Y
但我怀疑是否使用反射,我可以获得复合类成员的值,即 str?就像是y.GetType().GetProperty("x.str")
我也尝试过y.GetType().GetNestedType("X")
,但它给了我 null 作为输出。
我有一个由多个其他类组成的类。
class X
{
public string str;
}
class Y
{
public X x;
}
现在我知道使用反射可以获得直接成员的值,class Y
但我怀疑是否使用反射,我可以获得复合类成员的值,即 str?就像是y.GetType().GetProperty("x.str")
我也尝试过y.GetType().GetNestedType("X")
,但它给了我 null 作为输出。
就像是
y.GetType().GetProperty("x.str")
不,这行不通。您需要获取 property x
,获取它的 type,然后获取其他类型的 property:
y.GetType().GetProperty("x").PropertyType.GetProperty("str");
当然,要使其工作,您需要制作x
和str
属性,而不是字段。这是关于 ideone 的演示。
我也尝试过
y.GetType().GetNestedType("X")
,但它给了我 null 作为输出。
那是因为GetNestedType
给你一个在里面定义的类型Y
,像这样:
class Y {
class X { // <<= This is a nested type
...
}
...
}
您使用嵌套属性类型:
y.x.GetType().GetProperty("str").GetValue(y.x)
您可以使用表达式树来静态检索PropertyInfo
. 这还具有不使用字符串的优点,它支持更轻松的重构。
ExpressionHelper.GetProperty(() => y.x.str);
public static class ExpressionHelper
{
public static PropertyInfo GetProperty<T>(Expression<Func<T>> expression)
{
if (expression == null) throw new ArgumentNullException("expression");
PropertyInfo property = null;
var memberExpression = expression.Body as MemberExpression;
if (memberExpression != null)
{
property = memberExpression.Member as PropertyInfo;
}
if (property == null) throw new ArgumentException("Expression does not contain a property accessor", "expression");
return property;
}
}