3

各オブジェクトのすべてのプロパティの名前を取得する必要があります。それらのいくつかは参照型なので、次のオブジェクトを取得した場合:

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.Idプロパティの値も取得する必要があります。AlbumArtist.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ステートメントでは、プロパティが参照型の名前空間の下にあるかどうかを確認します。その場合は、ネストされたすべてのプロパティ値を取得する必要がありますが、そこで例外が発生します。

4

1 に答える 1

5

インスタンスのArtistプロパティを取得しようとしているため、これは失敗します。PropertyInfo

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

私が理解しているように、オブジェクトArtist内にネストされているインスタンス(インスタンス)からの値が必要です。rowAlbum

したがって、これを変更する必要があります。

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

于 2012-09-19T14:45:47.123 に答える