使用通用类型的反射属性名称

时间:2017-04-18 23:04:17

标签: c# generics reflection

我无法在我的反射方法中获取所有正确的值。似乎当我开始横穿模型时,该方法只是在它到达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; }

我相信我已经接近了,但另一双眼睛会受到赞赏。

1 个答案:

答案 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...