2015-02-23 86 views
0

我有一個函數是一個外部REST Web API的包裝。在我的函數中,我正在檢查所需的參數,如果它們在那裏,那麼我發出請求並返回數據。如果缺少必需的參數,我將缺少參數的名稱和返回狀態記錄爲故障。如何從c#中的內部函數返回?

我已經提取了缺少的參數部分記錄到一個函數,因爲它將在函數中多次調用。這裏是我的代碼,因爲它代表:

public string WrapFunc(Dictionary<string, string> parameter) 
{ 
    //Check for required params 
    if (parameter.ContainsKey("Param1") && !string.IsNullOrEmpty(parameter["Param1"])) 
    { 
     objWebAPiRequest.Param1 = parameter["Param1"]; 
    } 
    else 
    { 
     LogRequiredParameterError("Param1"); 
     response = "FAILURE"; 
     return response; 
    } 
} 

private void LogRequiredParameterError(string parameterName) 
{ 
    //Logging the missing parameter name to db 
} 

我正在尋找一種方式來封裝在LogRequiredParameterError方法的響應返回或更好的不重複自己返回失敗消息的一種優雅的方式。有什麼建議麼?

+0

如何拋出異常?或者這是否應該定期發生? – vesan 2015-02-23 04:46:20

+0

我不想使用異常,因爲我只是檢查所需的參數。他們也很貴,不是嗎? – Arunster 2015-02-23 04:47:50

+0

嗯,是的,它們有點貴,這就是爲什麼它們只能用於特殊情況 - 這是一種特殊情況嗎?否則,你是否正在尋找替代'response =「FAILURE」的方法;返回響應;'線? – vesan 2015-02-23 04:50:05

回答

1

缺少的參數添加到列表中,你走,然後再處理他們一次(和設置應對「失敗」一次)在方法結束。

public string WrapFunc(Dictionary<string, string> parameter) 
{ 
    var response = "SUCCESS"; 
    var missingParams = new List<string>(); 

    //Check for required params 
    if (parameter.ContainsKey("Param1") && !string.IsNullOrEmpty(parameter["Param1"])) 
    { 
     objWebAPiRequest.Param1 = parameter["Param1"]; 
    } 
    else 
    { 
     // Add the name of the missing param to a list 
     missingParams.Add("Param1"); 
    } 

    if (missingParams.Any()) 
    { 
     // Log all the missing parameters and set response to "FAILURE" 
     foreach (var p in missingParams) 
      LogRequiredParameterError(p); 

     response = "FAILURE"; 
    } 

    return response; 
} 

private void LogRequiredParameterError(string parameterName) 
{ 
    //Logging the missing parameter name to db 
} 
+0

你也可以修改你的日誌記錄方法來接受'List '並一次性傳遞它們,但這只是將foreach循環移動到其他方法中。 – 2015-02-23 05:01:08

+0

謝謝!這就是我一直在尋找的! – Arunster 2015-02-23 06:19:04

0

好吧,這只是2號線更換,但你可以做這樣的事情:

public string WrapFunc(Dictionary<string, string> parameter) 
{ 
    //Check for required params 
    bool hasAllParams = true; 
    hasAllParams = CheckParam(parameter, "Param1") && hasAllParams; 
    //hasAllParams = CheckParam(parameter, "Param2") && hasAllParams; etc. 

    if (hasAllParams) 
    { 
     //proceed normally 
     response = "SUCCESS"; //might be worth making it a const 
    } 
    else 
    { 
     response = "FAILURE";    
    } 
    return response; 
} 

private bool CheckParam(Dictionary<string, string> parameters, string paramName) 
{ 
    if (!parameters.ContainsKey(paramName) || string.IsNullOrEmpty(parameters[paramName])) 
    { 
     LogRequiredParameterError(paramName); 
     return false; 
    } 
    return true; 
} 

或者,如果有他們不同的條件,你可以寫其他參數的具體檢查功能而不僅僅是空着。

並回答你原來的問題 - 不,是沒有辦法來調用一個方法,並將它強行return在它的調用者。