[英]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.