2017-08-11 110 views
4

說我有2個對象ObjAObjB。假設他們是從一個叫CommonMethod()方法的同一個班級,我在尋找一種方法做這樣的事情:動態引用對象

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

而不是做的很長的路要走:

void CallObjectMethod(string name) 
{ 
    if(name == 'A') 
     objA.CommonMethod(); 
    else if(name == 'B') 
     objB.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 ...

,你應該驗證該字符串參數優先...