2010-11-26 15 views
0

我目前已經完成了我的構建腳本並已移至一些C#編程。使用基於在字典中選擇什麼對象的未知方法

這是我有:

public bool resultOfOperation(bool firstOperator, bool secondOperator, string operation) 
     { 
      //The bool value in the dictionary is gotten by used the corresponding operation method in the operation class. 
      Dictionary<string, bool> mappedObjects = new Dictionary<string, bool>(); 
      mappedObjects.Add("OR", new OrOperator().operationOR(firstOperator,secondOperator)); 

      foreach (KeyValuePair<string, bool> keyAndValue in mappedObjects) 
      { 
       if (keyAndValue.Key == operation.ToUpper()) 
        return keyAndValue.Value; 
      } 

      throw new ArgumentException("Something has gone very wrong."); 
     } 

雖然這個作品,我想其他人做一些事情。我想讓字典保持一個字符串和一個對象。然後我想根據我提供對象的方法使用正確的對象。

例(不工作)

Dictionary<string, object> test = new Dictionary<string, object>(); 
      foreach (KeyValuePair<string, object> keyAndValue in test) 
      { 
       if(keyAndValue.Key == "SomethingValue") 
        keyAndValue.Value.USE METHOD OF CLASS HERE; 
      } 

我應該指出,所有類都會有類似的方法,例如bool FUNCTIONname(布爾運算符)。

我相當肯定我有你匿名和委託,但我不知道如何。我將不勝感激任何幫助。

+0

你能否提供更多的上下文?這個代碼應該解決的實際問題是什麼? – 2010-11-26 11:45:03

+0

啊,是的,這非常含糊。我想要使​​用詞典中列出的類中的方法。但是因爲我不知道我會得到哪個類,所以我不知道要調用哪個方法名稱。那正是我想要解決的問題。 – Siemsen 2010-11-26 11:46:14

回答

1

而不是有獨特的方法名稱,而應該有相同的方法名稱,並利用類型系統的優勢!例如:

abstract class Operation { 
    public abstract bool DoOperation(bool left, bool right); 
} 

class OrOperation { 
    public override bool DoOperation(bool left, bool right) { 
     return left || right; 
    } 
} 

class DoOperationStuff { 
    Dictionary<string, Operation> mappedObjects = new Dictionary<string, Operation>() { 
     {"OR", new OrOperation()} 
    }; 

    public bool resultOfOperation(bool left, bool right, string operation) { 
     if(mappedObjects.ContainsKey(operation)) { 
      return mappedObjects[operation].DoOperation(left, right); 
     } 

     throw new ArgumentException("Something has gone very wrong."); 
    } 
} 

這應該是相當explanitory,但:

  • 抽象類是不能直接實例化類,但都意在通過其他類繼承。
  • 抽象(和虛擬)方法是打算在繼承類中重寫的方法。
  • 由於DoOperation標記爲抽象,程序知道查看對象的實際類型以知道要調用什麼。
  • 因此,即使程序有一堆Operation對象,每個對象實際上是一個OrOperation或其他任何東西,並獲取其各自的方法。
1

如前所述,接口或繼承是解決此問題的最佳方法。

如果因爲某些原因你不能使用它們,那麼你需要反思。 (對不起,我是一個VB程序員,所以我的C#語法可能是錯誤的,希望你能明白我的意思,雖然)

對象o =的對象上
MethodInfo的M = typeof運算操作(O) .GetMethod(「調用方法名稱」);
m.Invoke(o);

相關問題