Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9571

[C#] プロパティを文字列で指定して値をsetし、forループ中で使用する

$
0
0

もくじ
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クラスのメソッドを使用した。

やりたいことができた.cs
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;}

実行結果
image.png

GetProperty
image.png

SetValue
image.png

失敗例

C言語のポインタの配列のイメージで、下記のようにしたが、うまくいかなかった。
(暫くC言語書いてない&想像で書いて実際にコンパイルしてないので正しく動くか不明)

C言語のイメージ、こういうことが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;}}
そのイメージで書いた.cs
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;}

実行結果
image.png
元のプロパティの値を一気にforで変えたいのに、変わってない。

しらべたいこと

今回は、Data1Data2みたいに末尾に連続した数字がついていたので今回のやり方でループで処理できたが、そうでない場合でもループさせたいときは、やっぱり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


Viewing all articles
Browse latest Browse all 9571

Trending Articles