【C#】インデックスやフィールド名で構造体の値を取得する

インデックス(添え字)やフィールド名で構造体の値を列挙したり取得したりする方法。
ちなみにクラスでも(1行目のstructをclassに変更)同様の結果が得られます。

参考サイト
stackoverflow.com

struct MyStruct
{
    public string Name;
    public int Age;
    public string Address;

    public MyStruct(string p1, int p2, string p3)
    {
        Name = p1;
        Age = p2;
        Address = p3;
    }
}

private void Test()
{
    MyStruct myStruct = new MyStruct("くまモン", 5, "熊本県");

    // FieldInfoを取得する
    Type typeOfMyStruct = typeof(MyStruct);
    System.Reflection.FieldInfo[] fieldInfos = typeOfMyStruct.GetFields();

    // フィールドを列挙する
    foreach (var fieldInfo in fieldInfos)
    {
        Console.WriteLine($"{fieldInfo.Name}:{fieldInfo.GetValue(myStruct)}");
    }

    // インデックスで取得する
    for (int i = 0; i < fieldInfos.Length; i++)
    {
        Console.WriteLine($"{fieldInfos[i].Name}:{fieldInfos[i].GetValue(myStruct)}");
    }

    // フィールド名で取得する
    Console.WriteLine($"{fieldInfos.FirstOrDefault(x => x.Name == "Name").Name}:" +
        $"{fieldInfos.FirstOrDefault(x => x.Name == "Name").GetValue(myStruct)}");
    Console.WriteLine($"{fieldInfos.FirstOrDefault(x => x.Name == "Age").Name}:" +
        $"{fieldInfos.FirstOrDefault(x => x.Name == "Age").GetValue(myStruct)}");
    Console.WriteLine($"{fieldInfos.FirstOrDefault(x => x.Name == "Address").Name}:" +
        $"{fieldInfos.FirstOrDefault(x => x.Name == "Address").GetValue(myStruct)}");
}

結果
f:id:ktts:20190409003337p:plain

※Type.GetFieldsメソッドで取得されるフィールド順序は、常に一定であることが保障されていないようです。
必要であるなら、下記サイトで示されるようにMetadataTokenプロパティで整列してからのほうが良いとのこと。

参考サイト
stackoverflow.com

    // インデックスで取得する
    fieldInfos = fieldInfos.OrderBy(x => x.MetadataToken).ToArray();
    for (int i = 0; i < fieldInfos.Length; i++)
    {
        Console.WriteLine($"{fieldInfos[i].Name}:{fieldInfos[i].GetValue(myStruct)}");
    }