質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

6748閲覧

C#において文字列で指定したクラスのメンバ変数を呼び出す方法

hitsub

総合スコア17

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2016/09/26 16:36

###最初に
C#の質問ですがUnityの機能を用いていることを断っておきます。

C#

1namespace UnityEngine { 2 public class JsonUtility { 3 public static T FromJson (string json); 4 } 5}

JSONのテキストからオブジェクトを作成するメソッドを用いています。

したいこと

入れ子関係になっているクラスが持つ共通の変数名のデータを、指定した文字列で取得したいです。

###現状

C#

1public class Hoge{ 2 3 public Data d; 4 5 public static void Main(){ 6 string text = "{" + 7 "\"m1\":{ \"data\":\"A\" }," + 8 "\"m2\":{ \"data\":\"B\" }" + 9 "}"; 10 d = UnityEngine.JsonUtility.FromJson<Data>(text); //JSONの読み込み 11 12 Console.Write(d.m1.data); // 出力:A 13 Console.Write(d.m2.data); // 出力:B 14 } 15 16 public class Data{ 17 public Member1 m1; 18 public Member2 m2; 19 public class Member1{ 20 public string data; 21 } 22 public class Member2{ 23 public string data; 24 } 25 } 26}

###こうしたい

d.m1.data,d.m2.dataとそれぞれアクセスするのではなく、例えば

C#

1public class Hoge{ 2 3 public Data d; 4 5 public static void Main(){ 6 string text = "省略"; 7 d = UnityEngine.JsonUtility.FromJson<Data>(text); 8 9 for (int i=1; i<=2; i++){ 10 string res = d.("m"+i).data; //こんな感じで動かしたい 11 Console.Write(res); 12 } 13 } 14 15 public class Data{ 16 //省略 17 } 18}

といったように、文字列で指定したクラスのメンバ変数を得る方法はないでしょうか。
ご教授お願い致します。

###補足
Unityで動かすコードですがほぼC#の質問であるためUnityのテンプレから外した書き方をしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

確かにリフレクションが妥当そうな感がありますが、リフレクションは遅いので頻度の高い処理には使わない方がいいです。

一応、他の解決案としては可能であれば、メンバをあらかじめDictionaryか配列にしておくことです。
JsonUtility でどうしても Dictionary を使いたい時
処理速度は言うまでもなく、実装の手間もリフレクションよりは楽だと思います。

一応、私的な蛇足ですが、
私のおすすめはjson.netです。特別な下準備なくどんなクラスでもそのままシリアライズ・デシリアライズできる強力なライブラリです。
ですが、難点としてはUnity版の場合は有料(通常のC#用の方は無料)ということです・・・

投稿2016/09/27 03:01

編集2016/09/27 03:14
ishi9

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hitsub

2016/09/27 15:32

確かに実装の手間考えると他のライブラリに頼る等した方がよさそうですね・・・ JsonUtility以外で触ってみようと思います、回答ありがとうございました。
guest

0

こんにちは。

実行時エラーが発生する可能性はありますが、リフレクションは既に調査されてましたか。
http://dobon.net/vb/dotnet/programing/typeinvokemember.html

投稿2016/09/26 17:15

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hitsub

2016/09/27 08:05 編集

回答ありがとうございます。 調べてはいたのですが、子クラスの取得が分からず躓いていました。 public static void Main(){ string text = "省略"; Type type = typeof(Data); d = type.InvoleMember (null,BindingFlags.CreateInstance, null, null, null); d = UnityEngine.JsonUtility.FromJson<Data>(text); } この後、d.m1およびd.m2はどうやって呼べばいいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問