繁体   English   中英

处理重复代码和异常的更好方法

[英]Better way of handling repetitive code and exceptions

给出以下代码:

_samedayServiceDescription = com_SubServiceDescriptionExtDS.COM_SubServiceDescriptionExt.Where(r => r.Description.Equals(samedayService)).First().ServiceSubServiceId;
_onedayServiceDescription = com_SubServiceDescriptionExtDS.COM_SubServiceDescriptionExt.Where(r => r.Description.Equals(onedayService)).First().ServiceSubServiceId;
_datedServiceDescription = com_SubServiceDescriptionExtDS.COM_SubServiceDescriptionExt.Where(r => r.Description.Equals(datedService)).First().ServiceSubServiceId;
_unpaidServiceDescription = com_SubServiceDescriptionExtDS.COM_SubServiceDescriptionExt.Where(r => r.Description.Equals(unpaidService)).First().ServiceSubServiceId;
_recallServiceDescription = com_SubServiceDescriptionExtDS.COM_SubServiceDescriptionExt.Where(r => r.Description.Equals(recallService)).First().ServiceSubServiceId;

如果我所期望的项不存在,则在每个First()调用上都会出现异常,如果配置中的某些内容丢失,则可能是这种情况。 我希望能够在运行时告诉哪个抛出异常,以提供信息性消息,例如“嘿,您的配置缺少x服务”。

我能想到的唯一方法是在每行周围放置一个try / catch块。 当然有更好的方法吗?

如果可以使用C#6功能,则可以那样做。 首先定义通用扩展方法:

 public static class Extensions {
    public static T ThrowIfNull<T>(this T value, string msg) {
        if (value == null) {
            throw new Exception(msg);
        }
        return value;
    }
}

接着

_samedayServiceDescription = (com_SubServiceDescriptionExtDS.COM_SubServiceDescriptionExt
    .FirstOrDefault(r => r.Description.Equals(samedayService))?.ServiceSubServiceId)
    .ThrowIfNull("hey, your configuration is missing the service for x");

请注意,如果您的ServiceSubServiceId为struct(如int ),则整个表达式的结果将为int? ,尽管您可能希望它仍然是常规int 在这种情况下,您可以使用以下扩展方法:

public static T ThrowIfNull<T>(this T? value, string msg) where T : struct {
    if (!value.HasValue) {
        throw new Exception(msg);
    }
    return value.Value;
}

您可以同时使用这两种扩展方法,然后为可空值选择第二个方法,其余的为第一个方法。

使用FirstOrDefault()

_samedayServiceDescription = com_SubServiceDescriptionExtDS.COM_SubServiceDescriptionExt.Where(r => r.Description.Equals(samedayService)).FirstOrDefault().ServiceSubServiceId;
_onedayServiceDescription = com_SubServiceDescriptionExtDS.COM_SubServiceDescriptionExt.Where(r => r.Description.Equals(onedayService)).FirstOrDefault().ServiceSubServiceId;
_datedServiceDescription = com_SubServiceDescriptionExtDS.COM_SubServiceDescriptionExt.Where(r => r.Description.Equals(datedService)).FirstOrDefault().ServiceSubServiceId;
_unpaidServiceDescription = com_SubServiceDescriptionExtDS.COM_SubServiceDescriptionExt.Where(r => r.Description.Equals(unpaidService)).FirstOrDefault().ServiceSubServiceId;
_recallServiceDescription = com_SubServiceDescriptionExtDS.COM_SubServiceDescriptionExt.Where(r => r.Description.Equals(recallService)).FirstOrDefault().ServiceSubServiceId;

然后处理每个空值。 您还可以使用?? 最后进行初始化。 很干净。 像这样:

(com_SubServiceDescriptionExtDS.COM_SubServiceDescriptionExt.Where(r => r.Description.Equals(recallService)).FirstOrDefault()??new Type()).ServiceSubServiceId;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM