为方法及其调用者创建一个简单的IsNullOrFalse方法
本文关键字:方法 一个 简单 IsNullOrFalse 调用者 创建 | 更新日期: 2023-09-27 18:07:01
我发现自己经常这样做。
if( obj == null || !obj.SomeMethodThatReturnsABoolean() ) {
// then do this
}
我的意思是,我只是看到它在很多地方弄乱了代码。这并不是一件坏事,但如果你不能到处撒点语法糖,让东西变得更苗条,那么语法糖还有什么意思呢?
所以我试着做一个非常简单的方法,IsNullOrFalse
。其思想是,它将测试传入的内容,看看它是否为空,如果不是,它将运行该方法,并返回布尔值结果。
事实证明这比我想象的要困难得多。我真的不需要在任何项目中继续这样做,但在这一点上,我已经从好奇变成了好奇。
有其他人做过类似的事情吗?我得到的问题是,我不能传递的东西不存在,包含一个方法。
下面是一个扩展方法,它可以做到这一点
public static bool IsNullOrFalse<T>(this T value, Func<T, bool> del)
where T : class {
return value == null || !del(value);
}
现在你可以写
if (obj.IsNullOrFalse(o => o.SomeMethodThatReturnsABoolean())) {
...
}
注意:我个人不会采用这种方法,我更喜欢长手。这种解决方案会产生额外的分配(闭包+委托),一般来说,不会比原来的短多少。
每当我看到对null
值进行操作的扩展方法时,我也会畏缩。虽然在c#中是完全合法的,但对于不知道API是扩展方法的开发人员来说,它确实使调用站点代码难以遵循。
@JaredPar回答的稍微通用的版本:
public static TResult ValueOrDefaultIfNull<T, TResult>(this T obj, Func<T, TResult> getter, TResult defaultValue = default(TResult)) where T : class
{
return obj != null ? getter(obj) : defaultValue;
}
和用法:
if (!obj.ValueOrDefaultIfNull(mc => mc.SomeMethodThatReturnsABoolean()))
{
}
可以返回任何类型,而不仅仅是bool类型,因此,例如您可以这样做:
string zipCode = contact
.ValueOrDefaultIfNull(c=>c.Address)
.ValueOrDefaultIfNull(a=>a.ZipCode, string.Empty);
如果你真的想,你可以使用一个方法来检查null
和执行一个谓词,如果不是null:
public bool IsNullOrFalse(object obj, Func<bool> predicate)
{
if (obj == null)
return true;
else return !predicate();
}
这是你的问题的另一个解决方案。您可以创建对象的标准Empty实例(如String)。空,DateTime。MinValue等),当调用someemethodthatreturnsaboolean()时,它将返回false。然后你的调用者代码看起来像这样:
if ((obj ?? objEmpty).SomeMethodThatReturnsABoolean()){
// then do this
}
? ?当obj为null时,操作符将使用objEmpty实例,当调用objEmpty时,objEmpty.SomeMethodThatReturnsABoolean()
将返回false。
然而,这可能需要一些努力在你的someemethodthatreturnsaboolean()方法:
private bool isEmptyInstance;
public bool SomeMethodThatReturnsABoolean()
{
if (isEmptyInstance) { return false; }
// rest of the method
}