なんだかGoodVibes

日々の勉強メモです。

【C#】リフレクションを使用してプロパティ名で値を設定・取得をする

こんにちは。
本日はC#メモです。

概要

DBやファイルから値を取得し、
特定のプロパティに設定をする際、
数が少ない場合はいいですが
数が多くなると少し厄介になります(ミスも増えるし。。。)

リフレクションを使用することで、
プロパティ名でアクセスが可能になります。

本サンプルでは、Dictionaryで取得したデータを
リフレクションを使用して、プロパティに設定・取得を行います。

今回プロパティを設定・取得するクラスは以下とします。

private class ItemInfo
{
    public string Id { get; set; }
    public string Name { get; set; }
}


プロパティの設定

以下値を設定するコードです。
dicのkeyがプロパティ名に該当します。

public void Execute()
{
    var dic = new Dictionary<string, string>
    {
        { "Id", "1" },
        { "Name", "Bob" }
    };

    var itemInfo = new ItemInfo();
    foreach (var key in dic.Keys)
    {
        var property = typeof(ItemInfo).GetProperty(key);
        property.SetValue(itemInfo, dic[key]);
    }

    Console.WriteLine($"Id = {itemInfo.Id}, Name = {itemInfo.Name}");
}

GetProperty、引数に指定したプロパティ名に該当する
プロパティのSystem.Reflection.PropertyInfoを取得します。

typeof(ItemInfo).GetProperty(key);

SetValueで指定したオブジェクトのプロパティを設定します。
第一引数に設定するオブジェクト、第二引数に設定する値を指定します。

property.SetValue(itemInfo, dic[key]);

実行結果は以下です。

Id = 1, Name = Bob


プロパティを取得する

itemInfo = new ItemInfo
{
    Id = "2",
    Name = "Kevin"
};

var properties = typeof(ItemInfo).GetProperties();
foreach (var p in properties)
{
    var name = p.Name;
    var value = p.GetValue(itemInfo);
    Console.WriteLine($"Property Name = {name}, Value = {value}");
}

GetPropertiesを使用して指定したオブジェクトのプロパティを取得します。
GetPropertiesPropertyInfo[]を返します。

typeof(ItemInfo).GetProperties()

上記で取得したPropertyInfoを使用してプロパティ名と値を取得します。

var name = p.Name;
var value = p.GetValue(itemInfo);

実行結果は以下です。

Property Name = Id, Value = 2
Property Name = Name, Value = Kevin



以上です。