4

我有以下代码:

protected IEnumerable<string> GetErrorsFromModelState() {

    var exceptions = ModelState.SelectMany(x => x.Value.Errors
        .Select(error => error.Exception.Message));

    var errors = ModelState.SelectMany(x => x.Value.Errors
        .Select(error => error.ErrorMessage));

    return exceptions.Union(errors);
}

如果出现以下情况,有没有办法可以停止给出 nullReference 异常:

error.Exception is null  or if error.Exception.Message is null

这两种情况都给我带来了问题,我不确定如何使用 IsNullOrEmpty 检查对这两种情况进行编码。

4

4 回答 4

2

在您的选择之前添加 a.Where(error.Exception != null && error.Exception.Message != null)以仅包含您想要的值不是的那些null

于 2012-09-01T09:12:05.160 回答
2

怎么样

protected IEnumerable<string> GetErrorsFromModelState()
{        
    var exceptions = ModelState.SelectMany(x => x.Value.Errors
                            .Where(error => (error != null) && 
                                            (error.Exception != null) &&
                                            (error.Exception.Message != null))
                            .Select(error => error.Exception.Message));

    var errors = ModelState.SelectMany(x => x.Value.Errors
                            .Where(error => (error != null) && 
                                            (error.ErrorMessage != null))
                            .Select(error => error.ErrorMessage));

    return exceptions.Union(errors);
}
于 2012-09-01T09:16:30.057 回答
2

您可以使用May be Monad,首先编写一个静态类并将With 扩展方法放在该类中,然后简单地使用With方法。在链接中有一些其他类似的类型也很有帮助。

public static TResult With<TInput, TResult>(this TInput o, 
       Func<TInput, TResult> evaluator)
       where TResult : class where TInput : class
{
  if (o == null) return null;
  return evaluator(o);
}

并简单地使用它:

var exceptions = ModelState.SelectMany(x => x.With(y=>y.Value).With(z=>z.Errors))
        .Select(error => error.With(e=>e.Exception).With(m=>m.Message));

更新:为了更清楚(链接中也存在类似的示例),假设您具有Person类层次结构:

public class Person
{
   public Address Adress{get;set;}
}

public class Address
{
   public string PostCode{get;set;}
}

现在您想获取人员的相关邮政编码并且您不知道输入人员是否为空:

var postCode = 
// this gives address or null, if either person is null or its address
person.With(x=>x.Address) 
// this gives post code or returns null, 
// if previous value in chain is null or post code is null 
      .With(x=>x.PostCode);
于 2012-09-01T09:16:51.800 回答
1

然后过滤掉空值.Where(error => error.Exception != null)Exception对象应该总是有一个非空消息,所以如果有异常,我会把它算作一个错误来检测和修复)。

在这种情况下表现不同,然后例如.Select(error => error.Exception == null ? "No Error" : error.Exception.Message)

于 2012-09-01T09:17:42.277 回答