2015-02-23 81 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在它的调用者。