想象一下,我们有以下方法:
void Write(int? id, string s1, string s2, ... , string s10)
{
// prepare parameters:
// null/trim all (or some of) the string parameters
s1 = string.IsNullOrWhiteSpace(s1) ? null : s1.Trim();
s2 = string.IsNullOrWhiteSpace(s2) ? null : s2.Trim();
...
s10 = string.IsNullOrWhiteSpace(s10) ? null : s10.Trim();
// do write:
WriteRaw(id, s1, s2, ... , s10);
}
将记录写入数据库表。但是,在写入数据之前,需要"规范化"参数,例如修剪/归零那些字符串类型。
是否有可能以更优雅的方式重写参数准备部分?类似的东西:
void Write(int? id, string s1, string s2, ... , string s10)
{
//pseudo code:
{ s1, s2, ... , s10 }.ForEach((ref s) => {
s = string.IsNullOrWhiteSpace ? null : s.Trim();
});
WriteRaw(id, s1, s2, ... , s10);
}
UPD :我无法更改WriteRaw
的签名。除了字符串类型的参数之外,还可以存在其他类型的参数,例如:
void SetContactInfo(int? id, string firstName, string middleName, string lastName, bool isActive, string xmlContacts)
{
...
SetContactInfoRaw(id, firstName, middleName, lastName, isActive, xmlContacts);
}
答案 0 :(得分:1)
这会有帮助吗?
void Write(int? id, params string[] values)
{
var normalizedValues = values
.Select(v => Normalize(v))
.ToArray();
// do the rest
}
string Normalize(string v)
{
return string.IsNullOrWhiteSpace(v) ? null : v.Trim();
}
请注意,由于params
仅支持数组,因此很高兴
IEnumerable<string>
也会超载:
void Write(int? id, IEnumerable<string> values)
{
// ...
}
答案 1 :(得分:1)
虽然你可以使用与你的方法非常相似的东西来做到这一点,但
var s = new [] {s1, s2, ... , s10}
.Select( v => string.IsNullOrWhiteSpace(v) ? null : v.Trim()).ToList();
WriteRaw(id, s[0], s[1], ... , s[9]);
更好的方法是将支票包装到扩展方法中,并将其应用到位:
WriteRaw(id, s1.NullTrim(), s2.NullTrim(), ... , s10.NullTrim());
// This goes to a separate static "helper" class
internal static string NullTrim(this string s) {
return string.IsNullOrWhiteSpace(s) ? null : s.Trim();
}
第二种方法更经济,因为它不会创建包含要“标准化”的字符串的新列表或数组。
答案 2 :(得分:-1)
将s *参数作为数组或maped对象传递,然后您就可以更好地操作属性了!