2017-09-25 4 views
0

je la DTO suivante avec data..I mannequin a voulu savoir le nombre de la liste des entrées de l'objet StandardDTO: -besoin de trouver la propriété de l'objet DTO niché

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(); 
} 

problème est que je suis incapable de boucle récursive à l'intérieur StandardDTO -> VerificationSummary -> entrées

Il ne parvient pas à la ligne suivante lorsque PropInfo = "entrées" PropInfo

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

+0

s'il vous plaît poster vos commentaires/conseils. c'est très urgent. – user1581860

+0

J'essaye de mettre en application ceci dans. Net Core 1.1 – user1581860

Répondre

0

Ok.

Ainsi, l'erreur se produisait en raison de la déclaration suivante:

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

Vous devez envoyer le nouvel objet que vous avez progressé lorsque vous envoyez « entrées » comme ceci:

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

Cela devrait résoudre le problème.

En outre, pour vérifier une liste générique, au lieu de le faire:

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

Vous pouvez utiliser cette méthode:

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

Ce qui serait plus robuste.

+0

Thankyou Saurabh, son fonctionnement comme charme! – user1581860

0

Pourquoi utilisez-vous la réflexion?

vous pouvez simplement écrire:

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