2012-11-15 64 views
0

我寫了一個接受通用參數對象的方法。該方法接受具有不同屬性的不同參數對象。這個想法是基於「MethodName」屬性的值,我可以基於該特定參數對象的屬性構建一個URI。我使用反射來獲取名爲「MethodName」的屬性的值。這不是一種方法,只是一個屬性名稱。交換機案例聲明的替代方法

我在case語句中使用MethodName屬性的值。這似乎是一種低劣的方式來完成我的任務。特別是隨着MethodNames的數量增長。

下面是case語句實現的源代碼。任何幫助,將不勝感激。


public string ConstructBBAPIUri<T>(T parameters) 
    { 
     var methodName = ""; 
     var uri = ""; 
     var userId = ""; 
     long timeStamp = 0; 
     var signature = ""; 
     var sessionKey = ""; 
     var newUserId = ""; 

     if (parameters != null) 
     { 
      methodName = parameters.GetType().GetProperty("MethodName").GetValue(parameters, null).ToString(); 

      switch (methodName) 
      { 
       case "user.login": 
        userId = parameters.GetType().GetProperty("UserId").GetValue(parameters, null).ToString(); 
        timeStamp = Convert.ToInt64(parameters.GetType().GetProperty("TimeStamp").GetValue(parameters, null)); 
        signature = GenerateBunchBallSignature(userId); 

        uri = "method=" + methodName + "&apiKey=" + apiKey + "&userid=" + userId + "&ts=" + 
          timeStamp + "&sig=" + signature; 
        break; 

       case "user.modifyUserId": 

        //We shouldn't need the session key if user.login is being called first 
        userId = parameters.GetType().GetProperty("UserId").GetValue(parameters, null).ToString(); 
        newUserId = parameters.GetType().GetProperty("NewUserId").GetValue(parameters, null).ToString(); 

        uri = "method=" + methodName + "&sessionKey=" + sessionKey + "&oldUserId=" + userId + 
          "&newUserId=" + newUserId; 
        break; 
      } 
     } 

     return uri; 
    } 
+1

打開字符串在我看來是非常糟糕的。你爲什麼不驗證你的屬性是'enum ???'類型並打開枚舉值? – emartel

+1

'T'對象,它們是否有任何通用接口或基類?或者他們完全不同?順便說一句,你有控制他們,你能改變他們的代碼嗎? –

+0

最大,是T對象都有一個共同的接口。我確實可以控制代碼。 –

回答

4

更好的設計是委託構造類的URI。

  1. 用方法C​​onstructBBAPIUri()創建一個接口;
  2. 實現您有代碼訪問的新類或現有類的接口
  3. 對於現有類,您無權訪問代碼,從這些類繼承並實現接口。希望所有你需要的屬性都可以訪問,否則使用反射。
+0

非常感謝。早上看看這個。 –

0

的選擇是功能添加到字典中,但我看不出這將是比目前的方法要好得多,這將是更加混亂,而且容易出錯。

我認爲Max Shmelev暗示的是最好的解決方案。如果可以,爲每個將傳遞的類添加一個接口,併爲此方法添加一個通用約束。該接口將定義一個方法,該方法在對象中實現時將處理該對象的序列化。

如果列表長度不太多,你可以添加方法來處理各種不同類型的,只是有各種情況下在一個單一的方法調用。

+0

感謝大家的反饋。這非常有幫助。 –