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

用户2683328

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

我相信我已经接近了,但另一双眼睛会很感激。

鲁弗斯

这不起作用的原因是因为您提到的属性不是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...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用反射为泛型类型变量生成lambda类

来自分类Dev

使用反射为不同的泛型类型实现相同的功能

来自分类Dev

使用泛型参数化属性类型

来自分类Dev

使用泛型类型时“使用未声明的类型名称”

来自分类Dev

在运行时通过反射获取嵌套泛型类型对象的属性和属性值

来自分类Dev

泛型类型声明以进行反射

来自分类Dev

如何在没有反射的情况下确定Java中泛型属性的类类型?

来自分类Dev

访问泛型类型的属性

来自分类Dev

如何使用LINQ使用泛型类型查询[key]属性?

来自分类Dev

使用Kotlin中的泛型类型的反射来获取静态字段的值

来自分类Dev

通过派生类型使用反射调用泛型基类上的方法

来自分类Dev

如何使用反射将对象添加到类的实例的泛型列表属性中

来自分类Dev

从泛型类型中获取属性类型

来自分类Dev

反射性泛型类型范围和方法链接

来自分类Dev

如何用反射确定泛型数组元素的类型?

来自分类Dev

针对泛型类型的非泛型属性进行验证

来自分类Dev

泛型-动态使用类型

来自分类Dev

Java的泛型类型使用

来自分类Dev

反射:将反射类型转换为泛型,类型为字符串并对其进行迭代

来自分类Dev

获取属性类型并转换泛型

来自分类Dev

Swift泛型类型的属性和方法

来自分类Dev

基于泛型类型的可选属性

来自分类Dev

从扩展的泛型访问属性的类型

来自分类Dev

Kotlin从泛型类型获取属性

来自分类Dev

基于泛型类型的可选属性

来自分类Dev

具有泛型类型的属性

来自分类Dev

使用反射模型属性显示名称

来自分类Dev

使用反射嵌套的完全限定属性名称

来自分类Dev

泛型-使用父类在泛型中指定类型

Related 相关文章

热门标签

归档