我无法在我的反射方法中获取所有正确的值。似乎当我开始横穿模型时,该方法只是在它到达ItemData类时停止发现IEnumerables为横向。 (即它只会迭代ItemId和Active但不会将IEnumerables识别为属性)
我需要做的是获取整个类型中各种IEnumerables的名称。例如,当类型通过代码传递时,以下项目将添加到列表中:Content,Data,ItemAttributes,ItemUrls和InventoryInformation。
模特:
public class ModelBase<TModel>
{
public string Error { get; set; }
public IEnumerable<TModel> Content { get; set; }
}
public class ItemContent
{
public IEnumerable<ItemData> Data { get; set; }
public int Total { get; set; }
}
public class ItemData
{
public long ItemId { get; set; }
public bool Active { get; set; }
IEnumerable<ItemAttribute> ItemAttributes { get; set; }
IEnumerable<string> ItemUrls { get; set; }
IEnumerable<InventoryInformation> InventoryInformation { get; set; }
}
public class ItemAttribute
{
public string AttributeName { get; set; }
public bool IsRequired { get; set; }
}
public class InventoryInformation
{
public int AreaId { get; set; }
public double Price { get; set; }
}
守则:
// T is ModelBase<TModel> in this context...
// TModel is ItemContent in this context...
GetProperties(typeof(T));
private void GetProperties(Type classType)
{
foreach (PropertyInfo property in classType.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
if (property.PropertyType.IsGenericType && (property.PropertyType.GetGenericTypeDefinition() == typeof(IEnumerable<>)))
{
ValuesToList.Add(property.Name);
foreach (Type nestedType in property.PropertyType.GetGenericArguments())
{
GetProperties(nestedType);
}
}
}
}
private List<string> ValuesToList { get; set; }
我相信我已经接近了,但另一双眼睛会受到赞赏。
答案 0 :(得分:3)
这不起作用的原因是因为您提到的属性不是public
,并且您没有设置BindingFlags.NonPublic
绑定标记。
然后,将其设置为public
:
public class ItemData
{
public long ItemId { get; set; }
public bool Active { get; set; }
public IEnumerable<ItemAttribute> ItemAttributes { get; set; }
public IEnumerable<string> ItemUrls { get; set; }
public IEnumerable<InventoryInformation> InventoryInformation { get; set; }
}
或者,您可以将BindingFlags.NonPublic
添加到绑定标记:
private static void GetProperties(Type classType)
{
foreach (PropertyInfo property in classType.GetProperties(
BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic))
{
// other code omitted...