优雅构造,用于修剪传递给方法

时间:2015-10-30 13:09:09

标签: c# .net methods syntax parameters

想象一下,我们有以下方法:

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);
}

3 个答案:

答案 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对象传递,然后您就可以更好地操作属性了!