【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)}"); }
結果
※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)}"); }