获取列表中对象的属性

时间:2018-01-18 14:21:11

标签: c# list reflection

我正在做一些基于对象内属性的动态表单工作(创建一个datagridview来填充对象)。一切都很有效,直到我有一个List<>,我得到了一个Capacity和Count属性,但没有得到所述对象的正确属性。

dynamic ObjectToPopulate;
PropertyInfo[] PopulatedObjectProperties = ObjectToPopulate.GetType().GetProperties();

任何帮助总是受到赞赏。

2 个答案:

答案 0 :(得分:2)

您可以检查它是否是实现IEnumerable<T>的通用类型,然后您可以获得T的属性。这是一个执行此操作并返回类型的方法:

public static Type GetGenericTypeOfEnumerable(object o)
{
    Type firstGenericType = o.GetType().GetInterfaces()
        .Where(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEnumerable<>))
        .Select(t => t.GetGenericArguments()[0])
        .FirstOrDefault();
    return firstGenericType;
}

例如:

dynamic ObjectToPopulate = new List<string> { "foo" };
PropertyInfo[] PopulatedObjectProperties;

Type genericType = GetGenericTypeOfEnumerable(ObjectToPopulate);
if (genericType != null)
{
    PopulatedObjectProperties = genericType.GetProperties();
}
else
{
    PopulatedObjectProperties = ObjectToPopulate.GetType().GetProperties();
}

请注意,如果类型没有实现T似乎需要,则不会返回IEnumerable<T>。因此,如果您有class Test<T>,则Test的属性不会是T的属性。

答案 1 :(得分:0)

这是一个有效的例子。你可以试试这样的事情

        dynamic ObjectToPopulate = new ExpandoObject(); 
        ObjectToPopulate.Capacity = "50";
        ObjectToPopulate.Count = "100";          

       IDictionary<string, object> propertyValues = (IDictionary<string, object>)ObjectToPopulate;

propertyValues将同时包含ProperyNameValue

然后,您可以获得KeyValue

的列表
       var lstKeys = propertyValues.Select(kvp => kvp.Key).ToList();
       var lstValues = propertyValues.Select(kvp => kvp.Value).ToList();