2016-08-03 9 views
3

Ich habe folgende zwei KlassenHolen Eigenschaft Wert von Verschachtelte Klassen ist immer null

public class Family 
{ 
    public string ChildName { get; set; } 
} 

public class Employee 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public Family Child { get; set; } 

} 

ich eine Instanz der Klasse Employee wie folgt aufweisen.

Employee employee = new Employee(); 
employee.Name = "Ram"; 
employee.Id = 77; 
employee.Child = new Family() { ChildName = "Lava" }; 

Ich habe eine Methode, die den Eigenschaftswert auf der Grundlage der Eigenschaftsname wird wie folgt dar:

public static object GetPropertyValue(object src, string propName) 
{ 
    string[] nameParts = propName.Split('.'); 

if (nameParts.Length == 1) 
    { 
    return src.GetType().GetRuntimeProperty(propName).GetValue(src, null); 
    } 

foreach (String part in nameParts) 
{ 
    if (src == null) { return null; } 

    Type type = src.GetType(); 

    PropertyInfo info = type.GetRuntimeProperty(part); 

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

    src = info.GetValue(src, null); 
    } 
    return src; 
} 

Bei dem obigen Verfahren, wenn ich versuche, Eigenschaftswert von verschachtelten Klasse zu erhalten wie

GetPropertyValue(employee, "employee.Child.ChildName") 

oder

GetPropertyValue(GetPropertyValue(employee, "Family"), "ChildName" 

gibt keinen Wert zurück, da type.GetRuntimeProperty(part) immer Null ist.

Gibt es eine Möglichkeit, dieses Problem zu beheben?

Antwort

2

Sie Problem liegt in dieser Zeile:

foreach (String part in nameParts) 

Da Sie über jeden Teil von nameParts iterieren, die Sie iterieren auch „Mitarbeiter“, die natürlich keine gültige Eigenschaft ist.

Versuchen entweder das:

foreach (String part in nameParts.Skip(1)) 

Oder die Methode wie folgt aufrufen:

GetPropertyValue(employee, "Child.ChildName") 

(Mitteilung Nr. "Mitarbeiter", weil Sie bereits in einem Mitarbeiter übergeben)

1

Die Problem in diesem Fall ist, dass, wenn Sie die Zeichenfolge employee.Child.ChildName teilen, der "Mitarbeiter" ist der erste Teil. Jedoch ist employee keine Eigenschaft der Quelle, d. H. Employee Klasse.

starten:

public class Program 
{ 
    public static void Main() 
    { 
     Employee employee = new Employee(); 
     employee.Name = "Ram"; 
     employee.Id = 77; 
     employee.Child = new Family() { ChildName = "Lava" }; 
     GetPropertyValue(employee, "employee.Child.ChildName"); 

    } 


    public class Family 
    { 
     public string ChildName { get; set; } 
    } 

    public class Employee 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public Family Child { get; set; } 

    } 

    public static object GetPropertyValue(object src, string propName) 
    { 
     string[] nameParts = propName.Split('.'); 

     if (nameParts.Length == 1) 
     { 
      return src.GetType().GetRuntimeProperty(propName).GetValue(src, null); 
     } 
     nameParts = nameParts.Skip(1).ToArray(); 
     foreach (String part in nameParts) 
     { 
      if (src == null) { return null; } 

      Type type = src.GetType(); 

      PropertyInfo info = type.GetRuntimeProperty(part); 

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

      src = info.GetValue(src, null); 
     } 
     return src; 
    } 

Hier, ich habe den ersten Teil der Zeichenfolge das heißt „Mitarbeiter“ übersprungen. Sie können das Problem jedoch lösen, indem Sie Child.ChildName

übergeben