来自嵌套IEnumerable <model>的递归PropertyInformation

时间:2017-04-13 21:10:30

标签: c#

我无法在模型中获取IEnumerable属性的属性名称。我似乎无法从TModel类中获取嵌套的IEnumerables。我已经研究了一些反思的例子,但没有完全符合这些思路。

我希望获取每个嵌套模型的IEnumerable属性名称,并将属性名称发送到列表。实际价值并不重要。

非常感谢任何帮助。

// TModel = DataContent in this context.
public class GetModelBase<TModel>
{
    public string Error { get; set; }
    public IEnumerable<TModel> DataContent { get; set; }
}

public class DataContent
{
    public int Total { get; set; }
    public IEnumerable<Data> Data { get; set; }
}

public class Data
{
    public int DataId{ get; set; }
    IEnumerable<DataInformation> DataInformation{ get; set; }
}

public IEnumerable<GetModelBase<TModel>> ResponseAsList<TModel>()
{
    // ResponseBody in this context is a string representation of json of the models above...
    var toArray = new ConvertJsonArray<GetModelBase<TModel>>(ResponseBody).ReturnJsonArray();
}

// T = GetModelBase<DataContent> in this context.
public class ConvertJsonArray<T>
{
    public ConvertJsonArray(string responseString)
    {
        _responseString = responseString;
        Convert();
    }

    public void Convert()
    {
        var result = JObject.Parse(_responseString);

        // This is where I am having trouble... I am unable to get the nested IEnumerable names.
        Type t = typeof(T);
        PropertyInfo[] propertyInformation = t.GetProperties(BindingFlags.Public|BindingFlags.Instance);

        List<string> toLists = new List<string>();
        foreach (PropertyInfo pi in propertyInformation)
            toLists.Add(pi.Name);

        // End of Property Information Issuse...

        foreach (string s in toLists.ToArray())
        {
            if (result[s] != null)
            {
                if (!(result[s] is JArray)) result[s] = new JArray(result[s]);
            }
        }

        _jsonAsArray = result.ToString();
    }

    public string ReturnJsonArray()
    {
        return _jsonAsArray;
    }

    private string _responseString { get; set; }
    private string _jsonAsArray { get; set; }
}

我在上面的代码示例中寻找的结果将是一个仅包含IEnumerable名称的列表{“DataContent”,“Data”,“DataInformation”}

更新:

我仍然无法遍历每个模型。我有一个近乎工作的代码示例。

// This replaces the Type code in the Convert method...
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; }

此结果产生{“DataContent”,“Data”}但未能获得“DataInformation”。出于某种原因,在foreach循环中没有命中IEnumerables。其他帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您已经拥有PropertyInfo,因此您几乎就在那里 - 剩下的就是识别哪些属性属于IEnumerable<...>类型,其中...可以是任意类型。< / p>

为此,请检查PropertyType property。 它是一个Type实例,您可以通过GetGenericTypeDefinition method检查它是否基于泛型类型定义IEnumerable<T>。 该方法将为非泛型类型抛出异常,因此您还必须检查IsGenericType

if (pi.PropertyType.IsGenericType
    && (pi.PropertyType.GetGenericTypeDefinition() == typeof(IEnumerable<>)))
{
    toLists.Add(pi.Name);
}