C#Reflection在嵌套的Property Type中获取GetValues的对象

时间:2014-07-26 02:21:45

标签: c# reflection

我在最近几个小时内进行了搜索和测试,但我似乎无法得到我之后的结果。 我试图从嵌套属性中获取值。

我可以获取属性名称而不会出现以下问题。

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;
    }

我希望保持实际类型的通用性,因为我正在使用&#34; inobjects&#34;作为一个属性来获取不同类的很多属性,并希望以一种方式访问​​属性名称和值。

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

3 个答案:

答案 0 :(得分:3)

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

具体而言 - 您需要获取直接属性的值(实例)&#34; inobjects&#34;在您可以解析嵌套属性propertyName的值之前。

理想情况下,您将缓存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;
}

答案 1 :(得分:0)

我可以看到一些事情:

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

2)这是关于你想要从中获取值的对象的???。因此,如果您知道嵌套对象在对象中有多远,则只需将条件提取出来并将其保持到该行。如果它是"inobjects"对象,只需将a的设置中断,即可获得它。像这样:

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

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

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

答案 2 :(得分:0)

这将获得内在属性的值:

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);
     }
}

这不是最干净的方式,但这个例子会这样做。