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

开发 后端
利用C# 3.0提供的扩展方法技术,可以为已经编译好的程序集类型增加新的方法,从而应对新的扩展。除了在可扩展性方面所具有的优势之外,如果能够合理地结合泛型与类型推断,扩展方法还可以有效降低代码的重复,提高程序的可重用性。

请先看下面的代码

{
   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扩展方法,则之前的调用方式可以修改为:

Customer customer =newCustomerDAL().FindCustomers(Role.Admin).OrThrow(newMyException

("Can't find Customer")).First();

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

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

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

   returnobj;
}

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

publicclassListObject
{
   publicList Foo()
   {
       returnnull;
   }
}

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

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

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

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

【编辑推荐】

  1. 详解C#代码文件生成扩展代码文件
  2. 深入理解C# 3.0的五项主要改进
  3. 浅析C#编程中的内存管理
责任编辑:彭凡 来源: ITPUB个人空间
相关推荐

2009-09-01 11:04:59

C#调用扩展方法

2009-08-31 14:45:10

C#扩展方法

2009-08-10 17:36:17

C#扩展方法

2009-08-27 18:04:01

c#扩展方法string

2009-08-11 11:07:49

Java调用C# we

2009-08-31 18:05:14

C#调用WalkTre

2009-08-31 16:33:28

C#调用Dispose

2009-08-20 13:47:57

C#验证输入方法

2021-01-28 05:14:40

C#接口签名

2009-08-27 09:27:49

C#扩展方法

2009-08-26 15:53:48

C#扩展方法

2009-08-18 14:14:45

C#扩展方法性能测试

2009-08-27 16:24:48

扩展方法C# 3.0新特性

2009-08-03 12:57:27

C#调用DLL

2009-03-18 09:15:34

UndoRedoC#

2020-12-31 07:31:10

C# 反射数据

2009-09-11 10:59:06

Effective C调用Dispose()

2012-08-20 10:43:50

IBMdW

2009-08-05 09:30:39

C#调用DLL函数

2009-08-05 09:40:02

C#调用DLL函数
点赞
收藏

51CTO技术栈公众号