2016-03-05 182 views
3

我有下面的方法,我需要檢查參數是否爲空或空。如何爲多個參數檢查空字符串或空字符串? - C#

public DB Where(string field, string operat, string value, string andOr, string field2, string operat2, string value2) 
    { 
     _Where = " WHERE " + field + " " + operat + " @" + field + "1 " + andOr + " " + field2 + " " + operat2 + " @" + field2 + "2 "; 
     _Params.Add(field + "1", value); 
     _Params.Add(field2 + "2", value2); 
     return this; 
    } 

我已經找到了string.IsNullOrWhiteSpace方法然而這將需要這麼多代碼:

    if (string.IsNullOrWhiteSpace(field)) 
      throw new ArgumentException("field Cannot be null or be empty"); 

     if (string.IsNullOrWhiteSpace(operat)) 
      throw new ArgumentException("operat Cannot be null or be empty"); 

     if (string.IsNullOrWhiteSpace(value)) 
      throw new ArgumentException("value Cannot be null or be empty"); 

     if (string.IsNullOrWhiteSpace(andOr)) 
      throw new ArgumentException("andOr Cannot be null or be empty"); 

     if (string.IsNullOrWhiteSpace(field2)) 
      throw new ArgumentException("field2 Cannot be null or be empty"); 

     if (string.IsNullOrWhiteSpace(operat2)) 
      throw new ArgumentException("operat2 Cannot be null or be empty"); 

     if (string.IsNullOrWhiteSpace(value2)) 
      throw new ArgumentException("value2 Cannot be null or be empty"); 

有縮短這個的方法嗎?

此外,我已經嘗試爲此任務創建一個自定義方法,但是它會在自定義方法而不是Where()方法中引發異常,從而使調試變得棘手。

+0

您可以創建一個靜態梅託德:'ValidateParameterNotEmpty(字符串名稱,字符串值)'。您將減少行數到1/3 – xanatos

+0

您需要做的預防SQL注入的驗證將會花費更多的工作量,所以我會優先考慮。 – Crowcoder

+2

如果該字段爲空或空,那麼在以您的方式拋出'ArgumentException'時不會出現任何內容。你的意思是使用['nameof'](https://msdn.microsoft.com/en-us/library/dn986596.aspx)? –

回答

2

您可以逐個檢查值或創建中間函數來做到這一點。

另外,我的建議是:你可以把所有的輸入數組中,並使用LINQ任何在一次檢查所有的:

public DB Where(string field, string operat, string value, string andOr, string field2, string operat2, string value2) 
{ 
    string[] inputs = {field, operat, value, andOr, field2, operat2, value2} 
    if (inputs.Any(x => string.IsNullOrWhiteSpace(x))){ 
     //throw exception 
    } 
    //continue with your method, all inputs are OK 
} 
1

我可以建議是這樣的:

private string _nullChecker(string _value){ 
    if (string.IsNullOrWhiteSpace(_value)) 
      throw new ArgumentException(_value + "Cannot be null or be empty"); 
    return _value; 
} 

然後,在你的其中string聲明

_Where = " WHERE " + _nullChecker(field) + " " + __nullChecker(operat) + " @" + _nullChecker(field) + "1 " + _nullChecker(andOr) + " " + _nullChecker(field2) + " " + _nullChecker(operat2) + " @" + _nullChecker(field2) + "2 "; 

不知道這個雖然。沒有用實際的代碼檢查它。 :)希望這可以幫助

+1

或者它可能是一個擴展方法。 – tsul

0

你可以這樣做:

int? GetLength(string s) { 
    return s == "" ? -1 : s?.Length; 
} 

// s1, s2 and so on are your parameters 
int? lengthSum = GetLength(s1) + GetLength(s2); // and so on 
int wholeLength = (s1 + s2).Length; // and so on 
if(lengthSum == wholeLength) { 
    // No parameter is null or empty 
} 
0

首先,你可以使用簡單的庫來進行參數驗證。看看這個名爲Argument Validator的函數,它具有方便的功能,可以將整體代碼減少一半。

這裏是你如何可以使用參數驗證庫做一個例子:

public DB Where(string field, string operat, string value, string andOr, string field2, string operat2, string value2) 
{ 
    var inputs = new string[] {field, operat, value, andOr, field2, operat2, value2}; 
    foreach(var input in inputs) 
    { 
     Throw.IfNullOrEmpty(input, nameof(input))); 
    } 
}