我正在做一些基于对象内属性的动态表单工作(创建一个datagridview来填充对象)。一切都很有效,直到我有一个List<>,我得到了一个Capacity和Count属性,但没有得到所述对象的正确属性。
dynamic ObjectToPopulate;
PropertyInfo[] PopulatedObjectProperties = ObjectToPopulate.GetType().GetProperties();
任何帮助总是受到赞赏。
答案 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
将同时包含ProperyName
和Value
然后,您可以获得Key
和Value
var lstKeys = propertyValues.Select(kvp => kvp.Key).ToList();
var lstValues = propertyValues.Select(kvp => kvp.Value).ToList();