【问题标题】:Class property name and its data type for sub class using Reflection使用反射的子类的类属性名称及其数据类型
【发布时间】:2018-03-14 14:55:08
【问题描述】:

我正在尝试为任何类动态获取类属性名称及其数据类型,以便我可以构建 Db 所需的模式模型,例如谷歌大查询。 我能够获取字符串或 int 属性名称和类型,但使用数组或自定义类列表不知道如何获取它们的类属性和名称。

我的模型是:

public class StateModel
{
    public string State { get; set; }
    public string Gender { get; set; }
    public int Year { get; set; }
    public string Name { get; set; }
    public int Number { get; set; }

    public int[] Items { get; set; }
    public List<string> Values { get; set; }

    public Coordinate[] OrdinateArray { get; set; }
    public List<Coordinate> Ordinates { get; set; }

    public Coordinate CoordinateObj { get; set; }
}

public class Coordinate
{
    public int Point { get; set; }
    public string Value { get; set; }
}

我获取类属性的方法是:

public static Dictionary<string, object> GetColumnFromClass<T>() where T : class, new()
{
    Dictionary<string, object> fields = new Dictionary<string, object>();
    T obj = new T();
    var type = obj.GetType();    
    PropertyInfo[] properties = type.GetProperties();
    foreach (var item in properties)
    {
        fields.Add(item.Name, item.PropertyType.Name.ToUpper())
    }
    return fields;
}

谁能帮我从以下属性中获取坐标类详细信息,即(坐标类的点和值名称):

public Coordinate[] OrdinateArray { get; set; }
public List<Coordinate> Ordinates { get; set; }
public Coordinate CoordinateObj { get; set; }

注意:我需要动态获取子类详细信息,而不是硬编码。

【问题讨论】:

  • @DiskJunky 我的问题不是仅确定它的集合,而是获取集合属性名称及其数据类型。我在问题中已经明确提到了
  • @DiskJunky 抱歉,我没有迭代任何列表。这个类只是一个泛型类型,我需要获取它的所有属性名称和数据类型,与属性值无关。我感谢您为提供帮助而付出的努力,但我的问题很简单,如果该类被定义为简单类 List 或 [],如何获取自定义子类属性名称及其数据类型。
  • 抱歉,我没有从这个问题中得到答案。澄清一下,您是否试图从属性OrdinateArray 中获取类型Coordinate?看起来您已经有了属性名称,只是缺少类型...如果我理解正确的话?
  • @DiskJunky 宾果游戏没错。由于类型是自定义类,我可能还需要读取自定义类的所有属性名称和数据类型..

标签: c# .net console


【解决方案1】:

请看这是否符合您的要求(父子属性名相同会导致父条目只有一个,这可以通过递归深度参数来处理):

private static ConcurrentDictionary<string, object> GetColumnFromClass(object obj, ConcurrentDictionary<string, object> fields)
        {
            //null type will not be processed
            if (obj == null)
                return null;

            Type objType = obj.GetType();
            PropertyInfo[] properties = objType.GetProperties();

            foreach (PropertyInfo property in properties)
            {
                if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(List<>))
                {
                    Type itemType = property.PropertyType.GetGenericArguments()[0];
                    if (itemType == typeof(string))
                        fields.AddOrUpdate(property.Name, property.PropertyType.Name.ToUpper(), (k, o) => o);
                    else
                    {
                        fields.AddOrUpdate(property.Name, property.PropertyType.Name.ToUpper(), (k, o) => o);
                        GetColumnFromClass(Activator.CreateInstance(itemType), fields);
                    }
                }
                else
                {
                    object propVal = property.GetValue(obj, null);
                    if (property.PropertyType.Assembly == objType.Assembly)
                    {
                        fields.AddOrUpdate(property.Name, property.PropertyType.Name.ToUpper(), (k,o) => o);
                        GetColumnFromClass(propVal, fields);
                    }
                    else
                    {
                        fields.AddOrUpdate(property.Name, property.PropertyType.Name.ToUpper(), (k, o) => o);
                    }
                }
            }
            return fields;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 2011-05-14
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多