2017-09-25 74 views
0

我有以下的DTO與虛擬data..I想找出條目列表從StandardDTO對象計數: -需要找到嵌套的DTO對象的屬性

public class StandardDTO 
{ 
    public string InternalNotes { get; set; } 
    public string CustomerNotes { get; set; } 
    public List<Principal> Principals { get; set; } 
    public VerificationSummary VerificationSummary{ get; set; } 
} 

public class Principal 
{ 
    public string PrincipalTitle { get; set; } 
    public string PrincipalName { get; set; } 
} 

public class VerificationSummary 
{ 
    public List<Entry> Entries { get; set; } 
    public decimal GrossTotal { get; set; } 
    public decimal Total { get; set; } 
} 

public class Entry 
{ 
    public string PeriodName { get; set; } 
    public decimal Amount { get; set; } 
} 

void Main() 
{ 
    // Need to populate stdDTOObject and childXElement 
    int count = GetDTOObjectCount(GetStandardDTOObject(), "VerificationSummary"); 
    count.Dump(); 
} 

public StandardDTO GetStandardDTOObject() 
{ 
    StandardDTO stdDTOObj = new StandardDTO(); 
    stdDTOObj.InternalNotes = "InternalNotes"; 
    stdDTOObj.CustomerNotes = "CustomerNotes"; 

    List<Principal> lstPrincipal = new List<Principal>(); 
    Principal pObj = new Principal(); 
    pObj.PrincipalTitle = "Mr"; 
    pObj.PrincipalName = "ABC"; 
    lstPrincipal.Add(pObj); 

    pObj = new Principal(); 
    pObj.PrincipalTitle = "Mrs"; 
    pObj.PrincipalName = "XYZ"; 
    lstPrincipal.Add(pObj); 

    stdDTOObj.Principals = lstPrincipal; 

    VerificationSummary vs = new VerificationSummary(); 
    List<Entry> lstEntry = new List<Entry>(); 
    Entry entry = new Entry(); 
    entry.PeriodName = "Sept17"; 
    entry.Amount = 1212; 
    lstEntry.Add(entry); 

    entry = new Entry(); 
    entry.PeriodName = "Oct17"; 
    entry.Amount = 12000; 
    lstEntry.Add(entry); 

    entry = new Entry(); 
    entry.PeriodName = "Nov17"; 
    entry.Amount = 1000; 
    lstEntry.Add(entry); 

    entry = new Entry(); 
    entry.PeriodName = "Dec17"; 
    entry.Amount = 2000; 
    lstEntry.Add(entry); 

    entry = new Entry(); 
    entry.PeriodName = "Jan18"; 
    entry.Amount = 2000; 
    lstEntry.Add(entry); 

    vs.Entries = lstEntry; 
    vs.GrossTotal = 5555; 
    vs.Total = 10000; 
    stdDTOObj.VerificationSummary = vs; 
    return stdDTOObj; 
} 

public int GetDTOObjectCount<T>(T dtoObject, string nodeName) 
{ 
    var dtoObjectType = dtoObject.GetType(); 
    var objectProperties = GetPropertyInfo(dtoObjectType); 

    return GetDTOOBjectCountRecursively(objectProperties, nodeName, dtoObject); 
} 

public int GetDTOOBjectCountRecursively<T>(IEnumerable<PropertyInfo> objectProperties, string nodeName, T dtoObject) 
{ 
    foreach (PropertyInfo propInfo in objectProperties) 
    { 
     if (propInfo.Name.Equals(nodeName, StringComparison.OrdinalIgnoreCase)) 
     { 
      var lstDTOItems = propInfo.GetValue(dtoObject) as IList; 

      if (lstDTOItems != null) 
      { 
       return lstDTOItems.Count; 
      } 
      else 
      { 
       var objPropInfos = GetPropertyInfo(propInfo.PropertyType); 
       //hardcoded the nodeName just for this test. 
       return GetDTOOBjectCountRecursively(objPropInfos, "Entries", dtoObject); 
      } 
     } 
    } 
    return 0; 
} 

private IEnumerable<PropertyInfo> GetPropertyInfo(Type type) 
{ 
    return type.GetProperties(); 
} 

的問題是,我無法循環內遞歸 StandardDTO - > VerificationSummary - >條目

它未能在下面的行當propinfo = 「條目」 propinfo

變種lstDTOItems = propInfo.GetValue(dtoObject)作爲IList的;

+0

請發表您的意見/建議。它非常緊迫。 – user1581860

+0

我試圖在.Net Core 1.1 – user1581860

回答

0

好的。

所以錯誤發生在由於以下語句:

return GetDTOOBjectCountRecursively(objPropInfos, "Entries", dtoObject); 

您需要發送,你進步了,當你發送「條目」像這樣的新對象:

return GetDTOOBjectCountRecursively(objPropInfos, "Entries", propInfo.GetValue(dtoObject)); 

這應該可以解決問題。

此外,爲了檢查一個泛型列表,而不是做這樣的:

var lstDTOItems = propInfo.GetValue(dtoObject) as IList; 

您可以使用此方法:

private bool IsList(Object obj) 
{ 
    return obj is IList && obj.GetType().IsGenericType; 
} 

這將更加強勁。

+0

Thankyou Saurabh,它的工作就像一個魅力! – user1581860

0

爲什麼你使用反射?

,你可以簡單地寫:

var obj = GetStandardDTOObject(); 
var count = obj.VerificationSummary.Entries.Count();