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

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

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

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

Unity

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

Q&A

解決済

1回答

810閲覧

C# 基底クラスと派生クラス以外から見えない,派生クラスのfieldはありますか?

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2021/08/07 06:42

前提,実現したいこと

C#, Unity初心者です.
Unity上で使いまわしたいメソッドを持った以下のような基底クラスを作成しました.

C#

1public class BaseClass { 2 public void SetField(string field_name, dynamic value) { 3 this.GetType().GetField(field_name).SetValue(this, value); 4 } 5}

リフレクションを介してfieldにアクセスするmethodを持ちますが,
このBaseClass自身はfieldを持ちません.

そして,このクラスを継承した派生クラスを以下のように作成しました.

C#

1public class DerivedClass : BaseClass { 2 public int public_value; 3 private int private_value; 4 protected int protected_value; 5 public readonly int readonly_value; 6}

fieldをいくつか持ち,変数からfieldにアクセスすることを想定してBaseClassを継承しています.

そして次の例のようにDerivedClassを使っていこうとしたのですが,
基底クラスから派生クラスの隠蔽されたfieldにはアクセスできませんでした.

C#

1 var instance = new DerivedClass(); 2 instance.SetField("public_value", 10); // ok 3 instance.SetField("private_value", 10); // error 4 instance.SetField("protected_value", 10); // error 5 instance.SetField("readonly_value", 10); // error 6 7 instance.public_value = 100000000000; // public_valueを持ちたくない 8 9 // 実際の運用の際にはfield_nameは動的に指定します.

先述の通りBaseClassを使いまわしたい,
DerivedClass2,DerivedClass3を実装予定ですので,
DerivedClassにSetFieldを記述したくありません.

かといってDerivedClassのfieldをpublicにしたくはありません.

基底クラスからアクセスできるが,基底クラスと自身以外には見えないfieldの実装方法や,
それに似た運用をできる方法をそ教授いただきたいです.

よろしくお願いします.

バージョン

  • Unity: 2020.3.13f1
  • .NET: 4.x

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/08/07 07:06 編集

どう質問を修正したらよろしいでしょうか. 質問を取り下げろということでしょうか.
Zuishin

2021/08/07 07:06

BindingFlags を調べたらわかります。
退会済みユーザー

退会済みユーザー

2021/08/07 07:22 編集

C#初心者なので, 汎用的に使用したいメソッドにBindingFlagsを指定する利点がよくわかりません. デフォルトでは全てのfieldが返ってくるように見えます. よろしければご教授いただけますでしょうか.
Zuishin

2021/08/07 07:27

すべてのフィールドが返ってこないので困っているという質問でしょう? NonPublic を指定していないために public でないものが除外されています。
退会済みユーザー

退会済みユーザー

2021/08/07 07:34

なるほど,質問への回答を頂いていたのですね, ありがとうございます.
退会済みユーザー

退会済みユーザー

2021/08/07 07:37

継承する以前にDerivedClassにに直接実装していた際にはすべてのfieldが返ってきていたように見えたので, 勘違いしていました,ありがとうございます.
Zuishin

2021/08/07 07:40

この質問の根本的な問題を解決する回答とは思っていません。 質問の方向性に問題があると思っています。
退会済みユーザー

退会済みユーザー

2021/08/07 07:51

そうなんですね. 実装の方向性にまでご考慮頂きありがとうございます. 質問は解決したので閉じさせていただきます.
guest

回答1

0

ベストアンサー

C#

1public class BaseClass { 2 public void SetField(string field_name, dynamic value) { 3 this.GetType().GetField(field_name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).SetValue(this, value); 4 } 5}

これで解決いたしました.
GetFieldは,デフォルトではpublic static , public のみ返ってくるようです.

投稿2021/08/07 07:50

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問