【C#】GetPropertiesでクラス内のプロパティをループさせる

GetPropertiesを使うことで、クラス内のプロパティ一覧を取得することができ、それをforeachでループさせることもできます。
クラス内にプロパティが大量にある場合、一つ一つ指定する手間が省けて便利です。

【検証環境】.NET Framework 4.7.2

使い方

GetType().GetProperties()でプロパティ一覧を取得できます。
また、特定のプロパティ名や型を指定して絞り込むことも可能です。

var obj = new object(); //objにプロパティがあるとして...

//プロパティ一覧を取得
var properties = obj.GetType().GetProperties();

//特定のプロパティを取得(任意のプロパティ名指定)
var property = obj.GetType().GetProperty("propName");

//特定の型のプロパティを取得したい場合(任意の型指定)
var propertiesInt = properties.Where(w => w.PropertyType == typeof(int));
var propertiesDateTime = properties.Where(w => w.PropertyType == typeof(DateTime));

サンプルコード

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Tel { get; set; }
    public string Address { get; set; }
    public string Mail { get; set; }
}

static void Main(string[] args)
{
    var person = new Person()
    {
        Name = "ペン太",
        Age = 25,
        Tel = "080-xxxx-xxxx",
        Address = "東京都ホゲ区",
        Mail = "[email protected]",
    };
    CreateCSV(person);

    //CSVファイルを作成する場合
    void CreateCSV(object obj)
    {
        var filePath = @"D:" + "propertyinfo.csv";
        var sb = new StringBuilder();
        //クラス内プロパティのコレクションをループ
        foreach (var prop in obj.GetType().GetProperties())
        {
            if (string.IsNullOrEmpty(sb.ToString()))
            {
                sb.Append(prop.GetValue(obj));
            }
            else
            {
                sb.Append($",{prop.GetValue(obj)}");
            }
        }
        //ファイル作成処理
        StreamWriter file = new StreamWriter(filePath, false, Encoding.UTF8);
        file.WriteLine(sb.ToString());
        file.Close();
    }
}
class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Tel { get; set; }
    public string Address { get; set; }
    public string Mail { get; set; }
}

static void Main(string[] args)
{
    var people = new List<Person>()
    {
        new Person()
        {
            Name = "ペン太",
            Age = 25,
            Tel = "080-xxxx-xxxx",
            Address = "東京都ホゲ区",
            Mail = "[email protected]",
        },
        new Person()
        {
            Name = "ポンタ",
            Age = 42,
            Tel = "090-xxxx-xxxx",
            Address = "神奈川県ホゲ市",
            Mail = "[email protected]",
        },
    };
    CreateCSVByCollection(people);


    //コレクションで渡す場合
    void CreateCSVByCollection(IEnumerable<object> objs)
    {
        var filePath = @"D:" + "propertyinfo.csv";
        var sb = new StringBuilder();
        StreamWriter file = new StreamWriter(filePath, false, Encoding.UTF8);
        foreach (var obj in objs)
        {
            //クラス内プロパティのコレクションをループ
            foreach (var prop in obj.GetType().GetProperties())
            {
                if (string.IsNullOrEmpty(sb.ToString()))
                {
                    sb.Append(prop.GetValue(obj));
                }
                else
                {
                    sb.Append($",{prop.GetValue(obj)}");
                }
            }
            file.WriteLine(sb.ToString());
            sb.Clear();
        }
        file.Close();
    }
}

引数にobject型を指定しているので、様々なクラスに対して使うことが可能です。

Leave a Reply

Your email address will not be published. Required fields are marked *