もくじ
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f
やりたいこと
あるクラスで、同じようなデータを複数個、プロパティとして持っているものがあった。そいつが、
publicList<double>DataCollection=List<double>();
と持てばいいのに、
publicdoubleData1=0.0;publicdoubleData2=0.0;・・・publicdoubleData20=0.0;
みたいな形で持っていたために、そこに値を入れるときにいちいちData1 = 10.0;
を20回書かないといけない、みたいなことになりものすごく冗長となった。
元のプロパティを色々な事情で直せない場合でも、せめてforでくるくる回して、値を全部のプロパティに代入できるようにしたい。
今回の解
System.Reflection.PropertyInfo
クラスのメソッドを使用した。
classProgram{staticvoidMain(string[]args){varMyData=newMyData();for(inti=0;i<3;i++){MyData.GetType().GetProperty("Data"+(i+1)).SetValue(MyData,i);}Console.WriteLine($"OriginalProperty : {MyData.Data1}, {MyData.Data2}, {MyData.Data3}");}}publicclassMyData{publicdoubleData1{get;set;}=0.0;publicdoubleData2{get;set;}=0.0;publicdoubleData3{get;set;}=0.0;}
失敗例
C言語のポインタの配列のイメージで、下記のようにしたが、うまくいかなかった。
(暫くC言語書いてない&想像で書いて実際にコンパイルしてないので正しく動くか不明)
doubledata1=0;doubledata2=0;doubledata3=0;double*DataCollection[3]={&data1,&data2,&data3};voidmain(){inti=0;for(i=0;i<3;i++){*DataCollection[i]=10;}}
classProgram{staticvoidMain(string[]args){varMyData=newMyData();double[]DataCollection={MyData.Data1,MyData.Data2,MyData.Data3};for(inti=0;i<3;i++){DataCollection[i]=i;}Console.WriteLine($"Array : {DataCollection[0]}, {DataCollection[1]}, {DataCollection[2]}");Console.WriteLine($"OriginalProperty : {MyData.Data1}, {MyData.Data2}, {MyData.Data3}");}}classMyData{publicdoubleData1=0.0;publicdoubleData2=0.0;publicdoubleData3=0.0;}
実行結果
元のプロパティの値を一気にforで変えたいのに、変わってない。
しらべたいこと
今回は、Data1
、Data2
みたいに末尾に連続した数字がついていたので今回のやり方でループで処理できたが、そうでない場合でもループさせたいときは、やっぱりC言語の時みたいに書きたい。
なんかやり方ないか??
参考
https://docs.microsoft.com/ja-jp/dotnet/api/system.reflection.propertyinfo?view=netframework-4.8
[C#] 文字列でプロパティ名を指定してアクセス(参照・更新)する方法
https://webbibouroku.com/Blog/Article/access-property
【C#】プロパティ名でプロパティにアクセスする
https://qiita.com/tokishirazu/items/66a25331d4c78980366e