2017-01-20 1 views
0

Ich habe eine Methode, die Werte von Eigenschaften erhält oder Werte verschachtelter Eigenschaften, dieser Teil funktioniert gut, aber ich wollte Sammlung zu Zeichenfolge hinzufügen, falls eine Eigenschaft eine Sammlung ist und ich scheine haben ein Problem damit:Kann nicht zu Objektliste konvertieren

Code:

public static object GetNestedPropValue<TObject>(TObject obj, string propName) 
{ 
    string[] nestedObjectProp = propName.Split('.'); 
    string[] childProperties = nestedObjectProp.Skip(1).ToArray(); 

    string parentProp = nestedObjectProp.FirstOrDefault(); 

    foreach (string property in childProperties) 
    { 
     if (obj == null) 
     { 
      return null; 
     } 

     PropertyInfo info = obj.GetType().GetProperty(parentProp); 

     if (info == null) 
     { 
      return null; 
     } 

     object nestedObject = info.GetValue(obj); 

     if(childProperties.Count() == 1) 
     { 
      Type checkNestedType = nestedObject.GetType(); 

      if (IsICollection(checkNestedType) && IsIEnumerable(checkNestedType)) 
      { 
       var nestedObjectValues = nestedObject as List<object>; 

       return string.Join(", ", nestedObjectValues 
        .Select(i => i.GetType().GetProperty(childProperties.FirstOrDefault()).GetValue(nestedObject)) 
        .ToArray());     
      } 
      return nestedObject.GetType().GetProperty(childProperties.FirstOrDefault()).GetValue(nestedObject); 
     } 

     GetNestedPropValue(nestedObject, string.Join(".", childProperties.Skip(1))); 
    } 

    return null; 
} 

Problem ist hier:

var nestedObjectValues = nestedObject as List<object>; 

return string.Join(", ", nestedObjectValues 
    .Select(i => i.GetType().GetProperty(childProperties.FirstOrDefault()).GetValue(nestedObject)) 
    .ToArray()); 

Wenn ich versuche, zur Liste von Objekt zu geben sie es mir null gibt, was scheint t o das Problem sein?

+0

Offensichtlich ist 'nestedObject' keine' List '. Diese Frage kann nicht beantwortet werden, ohne die Definition des Quellentyps und der Quelleigenschaft, die als "info" bezeichnet wird, zu kennen. Der einfachste Weg, dies herauszufinden, besteht darin, den Wert im Debugger zu überprüfen. – Lee

+0

versuch: var nestedObjectValues ​​= nestedObject.ToList(); – jdweng

+0

@jdweng: NestedObject wird explizit als 'object' eingegeben,' nestedObject.ToList() 'wird nicht kompiliert – Falanwe

Antwort

2

nestedObject ist einfach keine List<object>, so nestedObject as List<object> gibt null zurück.

eine Sammlung Typ sein und zählbare ist sicher nicht die Art bedeutet, ist List<T> für einige T. Und selbst dann ein List<T> nicht direkt gießbaren zu einem List<object> sowieso (außer natürlich, wenn T ist object).

Ich bin mir nicht sicher, was Sie hier erreichen wollen, aber Typen durch Reflektion zu inspizieren, bevor Sie versuchen, Objekte auf eine lose vermutete Art zu werfen, fühlen sich sehr komisch an.

Verwandte Themen