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

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

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

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

リフレクション

リフレクションとは、プログラムの実行過程でプログラム自身の構造を読み取り、編集する事が出来るプロセスのことを指します

Unity

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

Q&A

解決済

2回答

2366閲覧

リフレクションを用いてList型にAddしたい

kenji007

総合スコア22

C#

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

リフレクション

リフレクションとは、プログラムの実行過程でプログラム自身の構造を読み取り、編集する事が出来るプロセスのことを指します

Unity

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

0グッド

0クリップ

投稿2020/11/22 07:22

前提・実現したいこと

リフレクションを使用して、
作成したデータをList型の中に格納したいのですがうまくいきません。
ご助言お願いいたします。

発生している問題・エラーメッセージ

NullReferenceException: Object reference not set to an instance of an object

該当のソースコード

public class character { public int ID; public string Name; } List<character> CharaList = new List<character>(); private void Start() { //キャラ作成 //----- character test = new character(); test.ID = 1; test.Name = "ゲレゲレ"; //格納 //--------- var add = this.GetType().GetField("CharaList").GetType().GetMethod("Add");  //① add.Invoke(CharaList, new character[] { test }); }

試したこと

"CharaList"を文字列で受け取って格納したいと思っています。

①と書いてある

this.GetType().GetField("CharaList").GetType().GetMethod("Add");  

が問題のようです。

そもそもCharaListがGetType()で取れてきていないようでnullになってしまいます。

this.GetType().GetField("CharaList").GetType().GetMethod("Add");

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

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

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

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

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

Zuishin

2020/11/22 08:45

List<T> とわかっているならキャストすればいいと思います。
kenji007

2020/11/22 09:13

すみません、ちょっとC#勉強中で申し訳ないのですがキャストするとコード的にはどのようになりますでしょうか。 お手数ですがよろしくお願いいたします。
BluOxy

2020/11/24 03:10

リフレクションを使う理由はなんでしょうか。 解決後にはなりますが、本当にその必要があるか気になったのでコメントだけ残しておきます。 今回の質問のように人が注意してコーディングをしないと実行時にエラーが起きるので、リフレクションを使うという選択はなるべくしない方が良いです。 人が注意するのではなく、C#で書いたソースコードをVisualStudioなどのツールでコンパイルすることで問題の回避をするという選択をするべきと思います。
guest

回答2

0

ベストアンサー

CharaList が public でないため、GetField で該当のフィールド情報を取得できないのは KOZ6.0 さんの仰る通りです。
ただ、GetField で得られるのは CharaList フィールドの値ではなく、CharaList フィールドの情報(FiledInfo型)です。
FieldInfo から CharaList フィールドの値を取得してからに Add してください。

C#

1var field = this.GetType() 2 .GetField( "CharaList", 3 BindingFlags.NonPublic | BindingFlags.Instance ); 4 5//CharaList フィールドの値を取得後、キャストしてから add メソッドを呼ぶ 6var instance = (List<character>)field.GetValue( this ); 7instance.Add( test );

(追記)

ちなみにわかったらでよいのですが
var instance = (List<character>)field.GetValue( this );
こちらの部分の
(List<character>)
この部分もStringの文字列で処理することとかできたりしますでしょうか……

よくわからないのですが、List<T>T部分が可変なのでキャストできないってことでしょうか?
それなら更にリフレクション使ってAddメソッド呼ぶとか?

C#

1var instance = field.GetValue( this ); 2 3var add = instance.GetType().GetMethod( "Add" ); 4add.Invoke( instance, new[] { test } ); 5

投稿2020/11/22 22:28

編集2020/11/23 07:56
draq

総合スコア2573

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

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

kenji007

2020/11/23 07:27

ありがとうございます。 こちらで教えていただいてもので一旦無事動くものが作れそうです! ちなみにわかったらでよいのですが var instance = (List<character>)field.GetValue( this ); こちらの部分の (List<character>) この部分もStringの文字列で処理することとかできたりしますでしょうか…… 現在作っているのがファイルを読み込んできてファイル名とおなじクラスにデータを配置、そのデータをList型の中に放り込んでいく、という処理を作っているので宣言部分なども文字列で処理できるととても助かります……
kenji007

2020/11/23 08:17

できた……? できましたああぁぁ!!!! すごく助かります!! 2週間位ずっと悩んでいたのですが、 「var instance = field.GetValue( this );」 この一文がどうしても出てこなくて、この一文のおかげで全解決できました!! 本当にありがとうございます、めっっっちゃ助かりました!!
guest

0

CharaList が public でないのでインスタンスが取得できません。
GetFields の第2引数に BindingFlags を指定してください。

C#

1var instance = this.GetType().GetField("CharaList", 2 BindingFlags.Instance | BindingFlags.NonPublic);

投稿2020/11/22 19:19

KOZ6.0

総合スコア2626

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

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

kenji007

2020/11/23 07:13

ありがとうございます、すみません、Publicにするのを忘れていましたのでそれを追加したいと思います。
KOZ6.0

2020/11/24 23:35

あーしまった、draq さんのおっしゃる通り、これで取れるのは FieldInfo ですね。 申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問