2012-02-14 2 views
1

私のプログラムでは、特定のクラストレーサ(A1、B2、C3など)のインスタンスが複数あります。ユーザーは、tracerListBoxというリストボックスを使用して、使用するトレーサーを決定します。Cでユーザ入力を使ってコンストラクタにアクセスするには

各トレーサにfamilyという名前のコンストラクタがあるとします。

私はA1、たとえば、の家族にアクセスしたい場合、私は単純に入力していることを知っている:

A1.family 

はしかし、私はこのような何かを達成コードを書きたい:

tracerListBox.Text.family 

ユーザが決めた値をコンストラクタに渡す方法はありますか?基本的には、使用するクラストレーサのインスタンスを決定し、その情報を使用して特定のトレーサに関するすべての情報を取得することが必要です。

お手数ですがお寄せいただきありがとうございます。

+1

単純な 'if(listBox.Text ==" A1 "){use A1.family}'を使用しないのはなぜですか?または辞書を介してそれをより汎用的にマップすることができます。ファミリが同じ種類のテキストを表示する場合は、反射を使用してこれを行うことができますが、可能であれば反射を避けることをお勧めします。 – sll

+0

プログラムが最終的に膨大な量のトレーサを持つため、if文を避けようとしています。しかし、あなたが上に挙げたもののような電話をすることができるのは分かっていなかったので、私はそれを念頭に置いています。コメントありがとう! – wcard

+0

コンストラクターには名前がありません。 'family'は* property *か* field *(他の可能性もあります)のようです。 – phoog

答えて

1

実際に決定を下すための詳細の多くはあなたの質問から欠けています。しかし、私たちはあなたの質問に答えることができる一般的な方向であなたを指摘することができます。

  • 反射は間違いなく助けになるはずです。開始するにはobject.GetType()を見てください。
  • (IOC)ライブラリをコントロールの異なる依存性注入または反転をチェックしてください。彼らはあなたが必要とするものかもしれません。あなたが探しているものを
+0

チップに感謝します。この言語を学ぶ上での私の問題の半分は、私が必要とするものを探すためのボキャブラリーを持っていません。 – wcard

5

時々、(それはコンストラクタでも仮想メソッドでもないですので、技術的に正しいではありません)仮想コンストラクタと呼ばれるfactory methodれます。 。

代わりにコンストラクタを呼び出す、あなたがで渡される引数によって決定されたクラスのコンストラクタを呼び出す静的メソッドを呼び出す

interface ITracer { 
    void Trace(string s); 
} 
class TracerA : ITracer { 
    public void Trace(string s) { 
     // ... 
    } 
} 
class TracerB : ITracer { 
    public void Trace(string s) { 
     // ... 
    } 
} 
class TracerFactory { 
    public static ITracer Make(string name) { 
     if (name.Equals("A")) return new TracerA(); 
     if (name.Equals("B")) return new TracerB(); 
     throw new ApplicationException("Unknown: "+name); 
    } 
} 
1

あなたはこのような何かを探しています:

string myType = "MyNamespace." + tracerListBox.Text + ", MyAssembly"; 
var = Type.GetType(myType); 
var property = t.GetProperty("family", BindingFlags.Static); 
関連する問題