0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-04-21

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

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

実行結果
image.png

GetProperty
image.png

SetValue
image.png

別解

コメントのほうで、インデクサを使ったやり方があるとアドバイス頂いたので試した。
コメント欄参照。↓↓

失敗例

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

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

そのイメージで書いた.cs
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;
}

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

しらべたいこと

今回は、Data1Data2みたいに末尾に連続した数字がついていたので今回のやり方でループで処理できたが、そうでない場合でもループさせたいときは、やっぱりC言語の時みたいに書きたい。
なんかやり方ないか??

参考

[C#] 文字列でプロパティ名を指定してアクセス(参照・更新)する方法
https://webbibouroku.com/Blog/Article/access-property

【C#】プロパティ名でプロパティにアクセスする
https://qiita.com/tokishirazu/items/66a25331d4c78980366e

インデクサ
https://ufcpp.net/study/csharp/oo_indexer.html

switch式
https://ufcpp.net/study/csharp/oo_indexer.html

0
2
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?