2017-04-13 49 views
0

我無法獲取屬性在我的模型中IEnumerable屬性的名稱。我似乎無法從TModel類獲得嵌套的IEnumerables。我已經看過一些反思的例子,但並沒有像這樣的話。來自嵌套IEnumerable的遞歸屬性信息<Model>

我正在尋找只獲取每個嵌套模型的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」,「數據」,「DataInformation」}

UPDATE:

我仍然無法循環遍歷每個模型。我有一個接近工作的代碼示例。

// 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

當我運行樣品(至少把它變成一個獨立的表格後),我得到'result'中的'Error'和'DataContent'。你的問題是如何識別哪些類型爲「IEnumerable <...>'? –

+0

是的,他們應該只顯示IEnumerable屬性名稱,但不僅僅是爲ModelBase,而且爲DataContent,Data和DataInformation列表。我想從每個嵌套對象中獲取所有可能的IEnumerable屬性名稱。 – user2683328

+0

啊,對 - 我想我把這個例子轉換成可編譯的東西時,我就殺了這個遞歸。無論哪種方式,我已經在[我的答案](http://stackoverflow.com/a/43402711/1430156)中解釋了所需的過濾條件。 –

回答

0

您已經有了PropertyInfo,所以您幾乎在那裏 - 剩下的就是識別哪些屬性類型爲IEnumerable<...>,其中...可以是任意類型。爲此,請檢查PropertyType property。 這是一個Type實例,您可以通過GetGenericTypeDefinition method來檢查它是否基於泛型類型定義IEnumerable<T>。 該方法將拋出非泛型類型的異常,所以你也必須檢查IsGenericType

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