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

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

ただいまの
回答率

90.48%

  • C#

    7487questions

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

  • Unity

    4230questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity2D

    935questions

unityでプロパティに動的変数でアクセスしたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 954

kaji

score 600

unityのc#で例えば"ext1"文字列が引数で渡された時に
Setting.csのプロパティのext1が表示されるようにしたいです。

Setting.csのext1プロパティについては

以下クラスでSetting.ext1でアクセスできました。

class Setting {
 public static string ext1 = "weight";
}

やりたいことはメインからext1の文字列が渡された時にweightと表示させたいです。

class MainScript {
 private void main() {
      this.method1("ext1");
 }
 private void method1(name) {
   Debug.Log(Setting.name); // ここでweightと表示させたいが、これだとnameプロパティを見てしまいエラーとなる
 }
}

phpであればSetting::$nameというような感じで表示できるのですが、
unityのc#ではどのようにすれば良いでしょうか?
検索してもどういうワードで検索して良いかわかりませんでした。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

文字列でプロパティを参照するのはおすすめしません。
問題が起きた際に特定が困難になるからです。
面倒ですがenumと拡張メソッドを実装するのがおすすめです。

//[注意] staticクラスにしました
static class Setting
{
    public static string ext1 = "weight";

    //プロパティーを参照するenum拡張メソッド
    public static string getProperty(this settingProperty type)
    {
        switch(type)
        {
            case settingProperty.ext1:
                return ext1;
        }

        return string.Empty;
    }
}

//enumを定義
enum settingProperty
{
    ext1
}

class MainScript
{
    private void main()
    {
        this.method1( settingProperty.ext1 );
    }

    private void method1(settingProperty type)
    {
        Debug.Log( type.getProperty() );
    }
}

Settingをstaticクラスにしない場合は別途静的クラスにenumの拡張メソッドを実装する必要があります。

static class settingPropertyEx
{
    //プロパティーを参照するメソッド
    public static string getProperty(this settingProperty type)
    {
        switch (type)
        {
            case settingProperty.ext1:
                return Setting.ext1;
        }

        return string.Empty;
    }
}

[追記]フィールドの取得にenumとそれに伴うエクステンションを記述するのは面倒なので他の安全なフィールドの取得方法を提供いたします。ごらんください。

 [追記] 内部で処理が必要で外部に値の取得のみ公開したい場合

プロパティを使う
プロパティは自動実装プロパティ(シンタックスシュガー)を持っていてスレッドセーフなgetter setterを簡単に記述できます。これを使うことで内部で処理しつつ必要な情報を外部に公開できます。

private static string ext1 = "weight";

//1 取得getterのみ公開
public static string Ext1
{
    get{
        //取得される度に何か処理したい場合はここに記述する。
        return ext1;
    }
}

//2 取得getter 代入setterを公開
public static string Ext2
{
    get{
        return ext1;
    }
    set{
        //valueに代入された値が入っています。
        ext1 = value;
    }
}

//3-1 短く書くとこういう感じでも書けます 初期化は別でしなければいけません。
public static string ext1_2
{
    //代入を内部のみ許可する
    get; private set;
}

//3-2 コンストラクタで初期化
public Setting()
{
    ext1_2 = "weight";
}

//4 Unity 2017 で C# 6.0が使える環境ならこう書けます
public static string ext1_3{ get; private set; } = "weight";

//外部から取得する方法
Setting.Ext1

値を定数化し外部に公開する

constまたはreadonlyを使うといいと思います。両方とも変更できない値(定数)を記述するキーワードです。違いがありますがここでは説明を省きます。

public static readonly string ext1 = "weight";
public const string ext2 = "weight";

//外部から取得する方法
Setting.ext1

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/26 12:14

    ありがとうございます。勉強になりました。

    キャンセル

+1

可変変数は使えないかと思いますので、Dictionary型で定義してしまうのはどうでしょうか

class Setting {
    public static Dictionary<string, string> dictionary = new Dictionary<string, string>()  
    {
        {"ext1", "weight"},
        {"ext2", "height"},
        {"ext3", "width"}
    };
}

class MainScript {
    private void main() {
        this.method1("ext1");
    }

    private void method1(name) {
        Debug.Log(Setting.dictionary[name]);
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

Reflectionを使って取得できます。

    void Start() {
        this.method1("ext1");
    }
    private void method1(string name) {
        Debug.Log(typeof(Setting).GetField(name).GetValue(null));
    }

    class Setting {
        public static string ext1 = "weight";
    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

同じタグがついた質問を見る

  • C#

    7487questions

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

  • Unity

    4230questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity2D

    935questions