我无法在模型中获取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。其他帮助将不胜感激。
答案 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);
}