温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#中怎么使用扩展方法对调用进行验证

发布时间:2021-07-12 16:59:28 来源:亿速云 阅读:273 作者:chen 栏目:编程语言

这篇文章主要讲解了“C#中怎么使用扩展方法对调用进行验证”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中怎么使用扩展方法对调用进行验证”吧!

请先看下面的代码

{
publicIEnumerable FindCustomers(stringroleName)
{
returnfrom customer
incontext.Customer
where customer.RoleName.Equals(roleName)
select customer;
}
}

当方法返回的结果为null时,采用如下方式进行调用,就会抛出NullReferenceException异常:

Customer customer =newCustomerDAL().FindCustomers(Role.Admin).First();


我们需要对返回结果进行验证,如果返回为null,则可以抛出自定义异常,或者创建一个空对象,例如:

publicIEnumerable FindCustomers(stringroleName)
{
IEnumerable customers = from customer
incontext.Customer
where customer.RoleName.Equals(roleName)
select customer;
if(customers ==null)
{
thrownewMyException("Cann't find the customers.");
}
returncustomers;
}

如果系统有许多方法都需要对返回结果进行验证,则这样的验证逻辑就会充斥在各个方法体中,既不利于重用,也会对未来的修改造成极大的阻碍。当然,我们可以引入Null Object模式来替代对null值的判断逻辑,但这种方式仍然需要为多种类型定义不同的Null Object类型。

Craig Andera在其博客文章中提出使用扩展方法对调用进行验证。他写道:NullReferenceException异常会抛出,但是我们希望有更具体的异常信息。因此,我们编写了如下的扩展方法:

publicstaticT OrThrow(thisT obj, Exception e){
if(obj ==null){
throwe;
}
returnobj;
}
利用OrThrow扩展方法,则之前的调用方式可以修改为:

OrThrow扩展方法对于你所要调用的类型而言是通用的,并且它返回了该类型,所以你可以将其插入到表达式链中,而不会丢失智能感应功能。并且因为类型推断功能,实际上并不需要指定具体的类型。

也就是说,OrThrow扩展方法可以应用到任何类型上,因此它可以在各种类型上重用非空验证甚至是调用验证。借鉴这一思想,我们还可以利用此方法默认实现对象实例的创建,以避免抛出NullReferenceException异常,例如:

publicstaticT Instance(thisT obj) where T:new()
{
if(obj ==null)
{
bj =newT();
}

由于Instance扩展方法中的类型参数T需要创建实例,因此必须添加new()约束。所以该扩展方法存在一定的局限,例如无法应用在之前的IEnumerable类型上。但对于如下的方法却非常有效:

publicclassListObject
{
publicList Foo()
{
returnnull;
}
}

通过Instance扩展方法,可以安全地调用List的相关属性和方法,例如Count属性:

Console.WriteLine(newListObject().Foo().Instance().Count);

控制台打印出来的结果为0。如果没有Instance扩展方法,则会抛出NullReferenceException异常。

作为C# 3.0增加的新特性,扩展方法在大量项目中得到了广泛地应用,但绝不仅仅是提高可扩展性这么简单。在进行项目开发时,若能适当地考虑使用扩展方法,说不定会带来出奇制胜的效果。

感谢各位的阅读,以上就是“C#中怎么使用扩展方法对调用进行验证”的内容了,经过本文的学习后,相信大家对C#中怎么使用扩展方法对调用进行验证这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI