2010-09-08 63 views
2

我想知道如何獲取C#中的屬性值,但此屬性是另一個類型。C#關於一個類的嵌套屬性的思考

public class Customer 
{ 
    public string Name {get; set;} 
    public string Lastname {get; set;} 
    public CustomerAddress Address {get; set;} 
} 

所以我能夠得到的名稱和姓氏的屬性值,但我挺不明白如何讓CustomerAddress.City的價值。

這是我到現在爲止。

public object GetPropertyValue(object obj, string property) 
{ 
    if (string.IsNullOrEmpty(property)) 
    return new object { }; 

    PropertyInfo propertyInfo = obj.GetType().GetProperty(property); 
    return propertyInfo.GetValue(obj, null); 
} 

然後在LINQ語句中使用這個方法。

var cells = (from m in model 
         select new 
         { 
          i = GetPropertyValue(m, key), 
          cell = from c in columns 
           select reflection.GetPropertyValue(m, c) 
        }).ToArray(); 

所以我沒有得到CustomerAddress的價值。

任何幫助將深表謝意。

**** ****更新

我這裏怎麼設法做到這一點。

public object GetNestedPropertyValue(object obj, string property) 
     { 
      if (string.IsNullOrEmpty(property)) 
       return string.Empty; 

      var propertyNames = property.Split('.'); 

      foreach (var p in propertyNames) 
      { 
       if (obj == null) 
        return string.Empty; 

       Type type = obj.GetType(); 
       PropertyInfo info = type.GetProperty(p); 
       if (info == null) 
        return string.Empty; 

       obj = info.GetValue(obj, null); 

      } 

      return obj; 
     } 
+0

如何設置一個嵌套屬性的值? (與此相同,但對於info.SetValue ...)? – Denis 2011-08-11 23:12:44

回答

3

首先,如果你想得到CustomerAddress.City的值,你永遠不會得到它。 CustomerAddress是類型,而不是屬性名稱。你想得到Address.City

也就是說,你的GetPropertyValue沒有設置做你想做的。

嘗試分裂名由點:

var propertyNames = property.split('.');

現在,你有屬性名稱{"Address", "City"}

列表然後,您可以通過這些屬性名稱循環,一個接一個,遞歸地呼叫GetPropertyValue

應該這樣做:)

+0

謝謝你解決了這個問題,我沒有想到遞歸。 – 2010-09-08 19:16:00

0

@邁克爾 - >反轉部分;-)

public static void SetNestedPropertyValue(object obj, string property,object value) 
     { 
      if (obj == null) 
       throw new ArgumentNullException("obj"); 

      if (string.IsNullOrEmpty(property)) 
       throw new ArgumentNullException("property"); 

      var propertyNames = property.Split('.'); 

      foreach (var p in propertyNames) 
      { 

       Type type = obj.GetType(); 
       PropertyInfo info = type.GetProperty(p); 
       if (info != null) 
       { 
        info.SetValue(obj, value); 
        return; 
       } 

      } 

      throw new KeyNotFoundException("Nested property could not be found."); 
     } 
+0

這完全沒用,它甚至沒有一個簡單的Typeconversion。它也不會創建父對象的新實例。在第二次迭代中將會有一個null參考。這根本不起作用,只適用於字符串,並且只適用於不是複雜類型的情況。 – 2018-01-29 14:13:53