もくじ
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f
やりたいこと
あるクラスで、同じようなデータを複数個、プロパティとして持っているものがあった。そいつが、
public List<double> DataCollection = List<double>();
と持てばいいのに、
public double Data1 = 0.0;
public double Data2 = 0.0;
・
・
・
public double Data20 = 0.0;
みたいな形で持っていたために、そこに値を入れるときにいちいちData1 = 10.0;
を20回書かないといけない、みたいなことになりものすごく冗長となった。
元のプロパティを色々な事情で直せない場合でも、せめてforでくるくる回して、値を全部のプロパティに代入できるようにしたい。
今回の解
System.Reflection.PropertyInfo
クラスのメソッドを使用した。
class Program
{
static void Main(string[] args)
{
var MyData = new MyData();
for (int i = 0; i < 3; i++)
{
MyData.GetType().GetProperty("Data" + (i + 1)).SetValue(MyData, i);
}
Console.WriteLine($"OriginalProperty : {MyData.Data1}, {MyData.Data2}, {MyData.Data3}");
}
}
public class MyData
{
public double Data1 { get; set; } = 0.0;
public double Data2 { get; set; } = 0.0;
public double Data3 { get; set; } = 0.0;
}
別解
コメントのほうで、インデクサを使ったやり方があるとアドバイス頂いたので試した。
コメント欄参照。↓↓
失敗例
C言語のポインタの配列のイメージで、下記のようにしたが、うまくいかなかった。
(暫くC言語書いてない&想像で書いて実際にコンパイルしてないので正しく動くか不明)
double data1 = 0;
double data2 = 0;
double data3 = 0;
double* DataCollection[3] = { &data1, &data2, &data3 };
void main()
{
int i = 0;
for (i = 0; i < 3; i++)
{
*DataCollection[i] = 10;
}
}
class Program
{
static void Main(string[] args)
{
var MyData = new MyData();
double[] DataCollection = { MyData.Data1, MyData.Data2, MyData.Data3 };
for (int i = 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}");
}
}
class MyData
{
public double Data1 = 0.0;
public double Data2 = 0.0;
public double Data3 = 0.0;
}
実行結果
元のプロパティの値を一気にforで変えたいのに、変わってない。
しらべたいこと
今回は、Data1
、Data2
みたいに末尾に連続した数字がついていたので今回のやり方でループで処理できたが、そうでない場合でもループさせたいときは、やっぱりC言語の時みたいに書きたい。
なんかやり方ないか??
参考
[C#] 文字列でプロパティ名を指定してアクセス(参照・更新)する方法
https://webbibouroku.com/Blog/Article/access-property
【C#】プロパティ名でプロパティにアクセスする
https://qiita.com/tokishirazu/items/66a25331d4c78980366e