3

我有这个条件

if(Model.Bids != null && Model.Bids.Items != null && Model.Bids.Items.Count > 0)
{
  ...
}

问题是,我认为这很丑陋。我可以编写一个封装它的函数,但我想知道是否还有其他东西可以帮助我编写类似于下面重要位的内容,而无需进行空值检查。如果不是,那么这将是一个方便的语言扩展。

if(Model.Bids.Items.Count > 0)
{
  ...
}
4

1 回答 1

4

对于 c#,这两个选项可以实现您想要的,但我不会很快将其放入我的软件中。我也怀疑这会变得更具可读性或更容易理解。还有另一种选择,但这需要您重构模型类链。如果您为输入类型和输入类型实现NullObject ,则可以这样做,因为所有类型都不会为空,但具有处理 Empty 状态的实现(很像 String.Empty)BidsItemif(Model.Bids.Items.Count > 0)

帮手

/* take a func, wrap in a try/catch, invoke compare */
bool tc(Func<bool> comp )
{
    try
    {
        return comp.Invoke();
    }
    catch (Exception)
    {
        return false;
    }
}

/* helper for f */ 
T1 f1<T,T1>(T root, Func<T, T1> p1) where T:class 
{
    T1 res = default(T1);
    if (root != null)
    {
        res = p1.Invoke(root);
    }
    return res;
}

/*  take a chain of funcs and a comp if the last 
    in the chain is still not null call comp (expand if needed) */
bool f<T,T1,T2,TL>( T root, Func<T,T1> p1, Func<T1,T2> p2, Func<T2,TL> plast, 
        Func<TL, bool> comp) where T:class where T1:class where T2:class
{
    var allbutLast = f1(f1(root, p1), p2);
    return allbutLast != null && comp(plast.Invoke(allbutLast));
}

用法

var m = new Model();
if (f(m, p => p.Bids, p => p.Items, p => p.Count, p => p > 0))
{
    Debug.WriteLine("f");
}
if (tc(() => m.Bids.Items.Count > 0))
{
    Debug.WriteLine("tc ");
}
if (m.Bids != null && m.Bids.Items != null && m.Bids.Items.Count > 0)
{
    Debug.WriteLine("plain");
}
于 2013-07-15T20:41:21.817 回答