我正在尝试合并以下代码。 (这里有两个例子)但是这个重复的模式检查字段是否为null然后如果它们是不同的,如果是,则将新值设置为旧值。
重写此内容以避免重复的最佳方法是什么?
if (String.IsNullOrEmpty(f.FirstName))
{
if (exisingPerson.FirstName != f.FirstName)
{
change = true;
exisingPerson.FirstName = f.FirstName;
}
}
if (String.IsNullOrEmpty(f.LastName))
{
if (exisingPerson.LastName != f.LastName)
{
change = true;
exisingPerson.LastName = f.LastName;
}
}
答案 0 :(得分:2)
我不认为你可以做很多事情来消除重复(至少不会引入反射,这可能会使代码变得混乱,而不是让它更清晰)。
但是你可以看看实现INotifyPropertyChanged
这是一个标准模式,用于通知对象的更改而不是你当前使用的布尔值:
如果您查看示例代码,那么它也会有一定的重复次数。
答案 1 :(得分:1)
您可以使用代理:
public static bool ChangeProperty(Func<Person, string> getter, Action<Person, string> setter, Person person, string value)
{
if (!String.IsNullOrEmpty(value) && !getter(person).Equals(value))
{
setter(person, value);
return true;
}
return false;
}
并用lambda这样调用它:
var barneyRubble = new Person();
change = ChangeProperty(p => p.FirstName, (p, v) => p.FirstName = v, barneyRubble, "Fred");
更好的办法是将方法放在Person
类中,并完全取消第三个参数,将其替换为this
。
可能有点矫枉过正,但如果你进行了很多这类属性的改变,它可能很有价值,而且我认为无论如何这都是一个有趣的模式。
答案 2 :(得分:0)
对于几个字段,您的代码可能是最好的。简短而简单。
答案 3 :(得分:0)
如果您正在执行此操作,则可以使用反射来遍历对象中的每个字段,并执行操作(如果它是String
。
然而,缺点是可读性。也许你最好不要明确,并通过大量使用单元测试来防止打字错误。