2017-08-11 16 views
4

ObjAObjBの2つのオブジェクトがあります。私はこれを理解オブジェクトを動的に参照してください

void CallObjectMethod(string name) 
{ 
    if(name == 'A') 
     objA.CommonMethod(); 
    else if(name == 'B') 
     objB.CommonMethod(); 
} 

void CallObjectMethod(string name) 
{ 
    // where name could be 'A' or 'B' 
    (Obj + name).CommonMethod(); 
} 

の代わりに、長い道のりをやって:彼らはメソッドと同じクラスからあると仮定するとCommonMethod()と呼ばれ、私はこのような何かをする方法を探していますおそらく反射を通じて行うことができますが、これを達成するための方法はかなりわかりません。

+0

「CommonMethod」のインターフェイスを作成することを検討する必要があります。次にobjAとobjBがそのインタフェースを実装するようにします – Wheels73

答えて

2

ObjAObjBの両方がクラスSomeClassであり、フィールド(メンバ変数)がthisの場合は、以下を使用できます。呼び出し元が誤った接尾辞(たとえば「A」ではなく「B」ではなく)を指定した場合、メソッドはもちろん例外をスローします。

class Example 
{ 
    private SomeClass ObjA; 
    private SomeClass ObjB; 

    void CallObjectMethod(string suffix) 
    { 
     string name = "Obj" + suffix; 
     var fieldInfo = this.GetType().GetField(name, BindingFlags.Instance | BindingFlags.NonPublic); 
     if (fieldInfo == null || (fieldInfo.FieldType != typeof(SomeClass)) throw ArgumentException(nameof(suffix)); 
     SomeClass obj = fieldInfo.GetValue(this) as SomeClass; 
     obj.CommonMethod(); 
    } 
} 

注:この解決策はあなたが求めるものですが、私は推奨しません。通常は、文字列で渡されるプライベートフィールド名に依存するように実装することは望ましくありません。

class Example 
{ 
    Dictionary<string, SomeClass> _objects = new Dictionary<string, SomeClass>(); 

    public SomeClass() 
    { 
     _objects["A"] = new SomeClass(); 
     _objects["B"] = new SomeClass(); 
    } 

    void CallObjectMethod(string key) 
    { 
     _objects[key].CommonMethod(); 
    } 
} 
+0

これは最初のオプションですが、実際にはこのクラスの(プライベート)フィールドのインスタンスに対してのみ機能します。正しい名前のインスタンスが他の場所に存在する場合、インスタンスは検出されません。 –

+0

こんにちはヨハン、はい、私は前提に述べました。さまざまな前提の下で、この例は軽微な変更を加えて作業することができますので、OPが彼の必要とする方向を得ることができれば幸いです。 –

6

あなたはタイプ<string, Obj>dictionaryを使用する必要があり、その後、この方法で実行します。

void CallObjectMethod(string name) 
{ 
    Obj ObjFromDictionary = MyDictionary[name]; 
    ObjFromDictionary.CommonMethod(); 
} 

あなたが直接、一時Obj ObjFromDictionaryを作成せずに...

コースコールのことができますし、検証する必要がありますその文字列パラメータが最初に...

関連する問題