[英]Get the names of parameters method
我有一個方法有很多參數。 其中一些是可選的。 因此,為了方便使用此方法,我使用可選參數功能。
此外,此方法構建一個Dictionary<string,string>
,其名稱為parameter作為字典的鍵,參數的值僅作為非null參數的字典值。
這是方法:
public string CreateParameterDictionary(
string id,
string firstName,
string lastName,
string address,
string postalCode,
string lorem = null,
string ipsum = null,
string dolor = null,
//...
string sit = null,
string amet = null)
{
if (String.IsNullOrWhiteSpace(id) ||
String.IsNullOrWhiteSpace(firstName) ||
String.IsNullOrWhiteSpace(lastName) ||
String.IsNullOrWhiteSpace(address) ||
String.IsNullOrWhiteSpace(postalCode))
{
throw new ArgumentNullException($"nameof((id) nameof(firstName) nameof(lastName) nameof(address) nameof(postalCode)");
}
Dictionary<string,string> parametersDictionary = new Dictionary<string, string>();
parametersDictionary.Add(nameof(((id),((id);
parametersDictionary.Add(nameof(firstName),firstName);
parametersDictionary.Add(nameof(lastName),lastName);
parametersDictionary.Add(nameof(address),address);
parametersDictionary.Add(nameof(postalCode),postalCode);
if (!String.IsNullOrWhiteSpace(lorem)) parametersDictionary.Add(nameof(lorem), lorem);
if (!String.IsNullOrWhiteSpace(ipsum)) parametersDictionary.Add(nameof(ipsum), ipsum);
if (!String.IsNullOrWhiteSpace(dolor)) parametersDictionary.Add(nameof(dolor), dolor);
//...
if (!String.IsNullOrWhiteSpace(sit)) parametersDictionary.Add(nameof(sit), sit);
if (!String.IsNullOrWhiteSpace(amet)) parametersDictionary.Add(nameof(amet), amet);
return parametersDictionary;
}
可以使用命名參數調用:
CreateParameterDictionary(5, "Dexter, "Morgan", "Miami", 12345, dolor: 5);
如您所見,該方法有點冗長。 我想知道是否有更簡潔的方法來編寫它(沒有反射)
謝謝 !
編輯
謝謝你的回答然而,我不清楚我的問題。 只是一個精度:
希望我的解釋現在更清楚了。
好吧,一個有很多參數的方法肯定會有代碼味道。 我會考慮創建一個支持類,用作DTO(數據傳輸對象)。
簡單的東西:
public class YourBusinessObjectRequestDto
{
public string id { get; set; }
public string firstName { get; set; }
public string lastName { get; set; }
public string address { get; set; }
public string postalCode { get; set; }
...
public Dictionary<string, string> ToDictionary()
{
var dict = new Dictionary<string, string>()
{
{ "id", id },
{ "firstName", firstName },
{ "lastName", lastName },
{ "address", address },
{ "postalCode", postalCode },
{ "...", ... }
};
return dict.Where(pair => pair.Value != null).ToDictionary(pair => pair.Key, pair => pair.Value);
}
}
代碼略有重復,但盡可能簡單,並且足以滿足我的口味。
如果您可以通過性能交換易維護性,則可以利用絕大多數Json庫的動態序列化功能。
使用Json.Net ,您可以執行以下操作:
public Dictionary<string, string> ToDictionary()
{
var json = JsonConvert.SerializeObject(this);
var serializerSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
return JsonConvert.DeserializeObject<Dictionary<string, string>>(json, serializerSettings);
}
它不會盡可能快,但只要您處理簡單類型,它就會很好地執行並適應您可以投入列表的每個參數。
這種方法的優點是調試和管理非常簡單:不需要位置參數。
編輯:我錯過了“排除非空值”的要求。 我編輯了代碼以支持它。
將方法重構為以下內容並使用代碼協定來檢查參數長度。 這樣,如果嘗試使用少於5個參數,則會出現編譯時錯誤。
public string CreateParameterDictionary(
string param1,
string param2,
string param3,
string param4,
string param5,
params string[] optionalParametes)
{
Contract.Requires(optionalParametes.Length <= 24);
}
將來,如果您有這么多參數:
在這種情況下,您可以使用數組:
public string CreateParameterDictionary(string[] param)
{
... same as before, but using param[4] instead of param4, etc...
}
請考慮使用param關鍵字。 看看這個例子,了解params關鍵字的用法。 它將幫助您將可變數量的參數傳遞給方法。 更改后,您的方法簽名將如下所示:
public string CreateParameterDictionary(
string param1,
string param2,
string param3,
string param4,
string param5,
param string[] variableParams = null,
)
{
//variableParams will contain your parameters from param6 to param30
}
我建議使用params
而不是參數列表:
// you want to return Dictionary<String, String> - right?
// static - I can't see any use of "this" in the method
public static Dictionary<string, string> CreateParameterDictionary(
params String[] values) {
if (null == values)
throw new ArgumentNullException("values");
// Required: we want at least 5 parameters
if (values.Length < 5)
throw new ArgumentException("Too few parameters");
// First 5 parameters must not be null or empty
if (values.Take(5).Any(item => String.IsNullOrEmpty(item)))
throw new ArgumentException("First five parameters must not be null or empty");
return values
.Select((item, index) => new {
index = index + 1,
value = item
})
.Where(item => !String.IsNullOrWhiteSpace(item.value))
.ToDictionary(item => "param" + item.index.ToString(),
item => item.value);
}
測試:
var result = CreateParameterDictionary("A", "B", "C", "D", "E", "F");
String report = String.Join(Environment.NewLine,
result.Select(pair => String.Format("{0} = {1}", pair.Key, pair.Value)));
// param1 = A
// param2 = B
// param3 = C
// param4 = D
// param5 = E
// param6 = F
Console.Write(report);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.