2012-09-19 45 views
1

我需要獲得名稱每個對象的所有屬性值。其中有些是引用類型,所以如果我得到以下對象:在嵌套屬性中使用GetValue()引發的TargetException

public class Artist { 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class Album { 
    public string AlbumId { get; set; } 
    public string Name { get; set; } 
    public Artist AlbumArtist { get; set; } 
} 

當從Album對象獲取的屬性我也需要獲取屬性AlbumArtist.IdAlbumArtist.Name其中嵌套的值。

到目前爲止我有以下代碼,但它試圖獲取嵌套的值時觸發System.Reflection.TargetException

var valueNames = new Dictionary<string, string>(); 
foreach (var property in row.GetType().GetProperties()) 
{ 
    if (property.PropertyType.Namespace.Contains("ARS.Box")) 
    { 
     foreach (var subProperty in property.PropertyType.GetProperties()) 
     { 
      if(subProperty.GetValue(property, null) != null) 
       valueNames.Add(subProperty.Name, subProperty.GetValue(property, null).ToString()); 
     } 
    } 
    else 
    { 
     var value = property.GetValue(row, null); 
     valueNames.Add(property.Name, value == null ? "" : value.ToString()); 
    } 
} 

所以在If聲明我只是檢查,如果財產是我的引用類型的命名空間下,如果是我應該得到的所有嵌套的屬性值,而這其中的異常。

在此先感謝您的幫助..

+0

爲什麼你需要思考,如果你有'Album'對象? –

+0

那麼我應該收到很多不同的對象,我只能在運行時才知道。 –

+0

對這種方法使用字典(屬性名稱和值的平面列表)會失敗,它有兩個類具有相同的屬性,如「名稱」 –

回答

3

這是因爲你試圖讓一個PropertyInfo實例的Artist屬性失敗:據我瞭解,你從Artist實例所需要的值

if(subProperty.GetValue(property, null) != null) 
    valueNames.Add(subProperty.Name, subProperty.GetValue(property, null).ToString()); 

它嵌套在row對象(它是一個Album實例)中。

所以,你應該改變這樣的:

if(subProperty.GetValue(property, null) != null) 
    valueNames.Add(subProperty.Name, subProperty.GetValue(property, null).ToString()); 

這樣:

var propValue = property.GetValue(row, null); 
if(subProperty.GetValue(propValue, null) != null) 
    valueNames.Add(subProperty.Name, subProperty.GetValue(propValue, null).ToString()); 

全(一點點的變化,以避免調用的GetValue當我們不需要)

var valueNames = new Dictionary<string, string>(); 
foreach (var property in row.GetType().GetProperties()) 
{ 
    if (property.PropertyType.Namespace.Contains("ATG.Agilent.Entities")) 
    { 
     var propValue = property.GetValue(row, null); 
     foreach (var subProperty in property.PropertyType.GetProperties()) 
     { 
      if(subProperty.GetValue(propValue, null) != null) 
       valueNames.Add(subProperty.Name, subProperty.GetValue(propValue, null).ToString()); 
     } 
    } 
    else 
    { 
     var value = property.GetValue(row, null); 
     valueNames.Add(property.Name, value == null ? "" : value.ToString()); 
    } 
} 

此外,您可能會遇到屬性名稱重複的情況,因此您的IDictionary<,>.Add將失敗。我建議在這裏使用更可靠的命名。

例如:property.Name + "." + subProperty.Name

+0

彼得非常感謝快速回復。你既準確又簡潔,你爲我節省了很多時間和精力。^_^ –

+0

歡迎您:) –