【问题标题】:C# Reflection get object for GetValues in nested Property TypeC# 反射获取嵌套属性类型中 GetValues 的对象
【发布时间】:2014-07-26 02:21:44
【问题描述】:

我已经搜索和测试了过去几个小时,但似乎无法获得我想要的结果。 我正在尝试从嵌套属性中获取值。

我可以毫无问题地获取以下属性名称。

public static IList<string> GetClassPropertyNames(object myObject)
 {   
  List<string> propertyList = new List<string>();
     if (myObject != null)
     {
         var a = myObject.GetType().GetProperty("inobjects").PropertyType.GetProperties();
         foreach (var prop in a)
         {
             propertyList.Add(prop.Name.ToString());
         }             
     }
     return propertyList;               
    }

但是,如果我随后使用其中一个名称作为字符串来获取属性,我将无法获取正确的对象或键入 GetValue(Object, null) 来获取我需要的值。

我正在使用以下内容。

public static string GetNestedProperty(object myObject, string PropertyName)
    {
        string s = null;
        var a = myObject.GetType().GetProperty("inobjects").PropertyType.GetProperties();
        foreach (PropertyInfo pi in a)
        {
            if(pi.Name == PropertyName)
            {
                s = pi.GetValue(???, null).ToString();                   
            }                
        }
        return s;
    }

我想保持实际类型的通用性,因为我使用“inobjects”作为属性来获取不同类的许多属性,并且想要一种访问属性名称和值的单一方式。

我只是无法在正确的级别获得正确的对象,因此不断遇到与我的类型不相关的问题。任何帮助将不胜感激。

【问题讨论】:

  • 我对这里的嵌套属性的含义有些困惑。你能举一个类的例子吗?

标签: c# reflection


【解决方案1】:

您的问题实际上归结为您需要获取 immediate 属性的实例,从中提取 nested 属性的值。

具体来说 - 在解析嵌套属性propertyName 的值之前,您需要获取直接属性“inobjects”的值(实例)。

理想情况下,您将缓存 PropertyInfo 实例,但要使代码以最简单的方式工作 - 像这样解析值:

...
if (pi.Name == PropertyName)
{
    var value = 
        myObject.GetType()
                .GetProperty("inobjects")
                .GetValue(myObject, null);

    s = (string) pi.GetValue(value, null);
}

您可能想知道您不需要手动迭代每个属性,并且可以使用 GetProperty 代替(如果属性不存在,它将返回 null)。我冒昧地为你重构了你的代码:

public static string GetNestedProperty(object value, string propertyName)
{
    var type = value.GetType();
    var property = type.GetProperty("inobjects");
    value = property.GetValue(value, null);
    type = property.PropertyType;

    property = type.GetProperty(propertyName);

    if (property == null)
    {
        return null;
    }

    value = property.GetValue(value, null);
    return (string) value;
}

【讨论】:

  • 太好了,由于使用 .ToString() 存储的一些属性,我不得不更改为直接字符串输出,但就是这样,将对象作为值是我错过的部分。 !!!
【解决方案2】:

我能看到的几件事:

1) (这可能不是问题,但发布它不会有什么坏处)您正在使用 foreach 循环,在满足条件时没有任何中断,这可能会导致一些麻烦,因为您可能有另一个满足条件。

2) 这是关于您的???,它实际上是针对您要从中获取值的对象。因此,如果您知道嵌套对象在对象中的距离,只需输入一个条件以提取该对象并将其保持到该行。如果是"inobjects" 对象,只需打破a 的设置,以便获得它。像这样的:

var rawNestedObject = myObject.GetType().GetProperty("inobjects");
var a = nestedObject.PropertyType.GetProperties();

然后您的??? 标记可以替换为nestedObject,这将是从rawNestedObject 中提取的引用。

APPEND:此外,您没有在 GetProperty 调用上使用任何默认为公共实例属性的标志。我不知道您命名公共成员的标准是什么,所以如果您正在访问公共实例属性,请随意忽略这一段。

【讨论】:

    【解决方案3】:

    这将为您获取内部属性的值:

    var a = obj.GetType().GetProperty("inobjects").PropertyType.GetProperties();
    foreach (var item in a)
    {
         if (item.Name == PropertyName)
         {
             var test = obj.GetType().GetProperty("inobjects").GetValue(obj,null);
             s = (string)test.GetType().GetProperty(PropertyName).GetValue(test, null);
         }
    }
    

    这不是最干净的方式,但这个例子可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多