为方法及其调用者创建一个简单的IsNullOrFalse方法

本文关键字:方法 一个 简单 IsNullOrFalse 调用者 创建 | 更新日期: 2023-09-27 18:07:01

我发现自己经常这样做。

if( obj == null || !obj.SomeMethodThatReturnsABoolean() ) {
  // then do this
}

我的意思是,我只是看到它在很多地方弄乱了代码。这并不是一件坏事,但如果你不能到处撒点语法糖,让东西变得更苗条,那么语法糖还有什么意思呢?

所以我试着做一个非常简单的方法,IsNullOrFalse。其思想是,它将测试传入的内容,看看它是否为空,如果不是,它将运行该方法,并返回布尔值结果。

事实证明这比我想象的要困难得多。我真的不需要在任何项目中继续这样做,但在这一点上,我已经从好奇变成了好奇。

有其他人做过类似的事情吗?我得到的问题是,我不能传递的东西不存在,包含一个方法。

为方法及其调用者创建一个简单的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
}