コンテンツにスキップ

C# クラスなどのオブジェクトのプロパティをループで取得する

Topic

オブジェクトのプロパティにforeachなどのループでアクセスする方法

Usage

リフレクションを利用して、GetType()で取得したオブジェクトのプロパティを参照する

using System.Text;

namespace prop;

class Program
{
    class Sample
    {
        public int MyProperty { get; set; }
        public string? MyName { get; set; }
    }

    static void Main()
    {
        Sample sample = new Sample()
        {
            MyProperty = 1,
            MyName = "Tom"
        };

        var props = new Sample().GetType().GetProperties();
        var sb = new StringBuilder();

        foreach (var prop in props)
        {
            sb.Append(prop.Name + Environment.NewLine);
            sb.Append(prop.GetValue(sample, null) + Environment.NewLine);
        }

        Console.WriteLine(sb.ToString());
        Console.ReadKey();

        // MyProperty
        // 1
        // MyName
        // Tom
    }
}

Eaxmple オブジェクトの配列をCSVとして出力する

以下の例では、SampleクラスのListをファイルに書き出してCSVとして保存している

using System.Text;

namespace prop;

class Program
{
    class Sample
    {
        public int MyProperty { get; set; }
        public string? MyName { get; set; }
    }

    public static void Main()
    {
        var list = new List<Sample>();
        list.Add(new Sample { MyProperty = 1, MyName = "Tom" });
        list.Add(new Sample { MyProperty = 2, MyName = "Bob" });
        list.Add(new Sample { MyProperty = 3, MyName = "Jack" });

        string filePath = Path.Combine(Environment.CurrentDirectory, "sample.csv");
        WriteCsv(filePath, list);
    }

    private static void WriteCsv(string filePath, List<Sample> list)
    {
        using (var sw = new StreamWriter(filePath, false, Encoding.GetEncoding("UTF-8")))
        {
            var props = new Sample().GetType().GetProperties();
            var sb = new StringBuilder();

            // カラム書き込み
            foreach (var column in props)
            {
                sb.Append(column.Name);
                sb.Append(",");
            }
            sb.Length -= 1;
            sw.WriteLine(sb.ToString());
            sb.Clear();

            // データ書き込み
            foreach (var data in list)
            {
                foreach (var column in props)
                {
                    sb.Append(column.GetValue(data, null));
                    sb.Append(",");
                }
                sb.Length -= 1;
                sb.Append(Environment.NewLine);
            }
            sw.Write(sb.ToString());
        }
    }
}

出力結果

MyProperty,MyName
1,Tom
2,Bob
3,Jack

Reference