Agentic AI、具身智能、强化学习框架、端侧大模型……来QCon上海站,感受AI的未来! 了解详情
写点什么

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

  • 2009-03-27
  • 本文字数:1347 字

    阅读完需:约 4 分钟

利用 C# 3.0 提供的扩展方法技术,可以为已经编译好的程序集类型增加新的方法,从而应对新的扩展。除了在可扩展性方面所具有的优势之外,如果能够合理地结合泛型与类型推断,扩展方法还可以有效降低代码的重复,提高程序的可重用性。例如,这样的方法实现:
public class CustomerDAL
{
public IEnumerable FindCustomers(string roleName)
{
return from customer
in context.Customer
where customer.RoleName.Equals(roleName)
select customer;
}
} 调用如下方法,可能抛出 NullReferenceException 异常:

Customer customer = new CustomerDAL().FindCustomers(Role.Admin).First(); 我们需要对返回结果进行验证,如果返回为 null,则可以抛出自定义异常,或者创建一个空对象,例如:

public IEnumerable FindCustomers(string roleName)
{
IEnumerable customers = from customer
in context.Customer
where customer.RoleName.Equals(roleName)
select customer;
if (customers == null)
{
throw new MyException(“Cann’t find the customers.”);
}
return customers;
} 如果系统有许多方法都需要对返回结果进行验证,则这样的验证逻辑就会充斥在各个方法体中,既不利于重用,也会对未来的修改造成极大的阻碍。当然,我们可以引入 Null Object 模式来替代对 null 值的判断逻辑,但这种方式仍然需要为多种类型定义不同的 Null Object 类型。

Craig Andera 在其博客文章中提出使用扩展方法对调用进行验证。他写道:

NullReferenceException 异常会抛出,但是我们希望有更具体的异常信息。因此,我们编写了如下的扩展方法:

public static T OrThrow(this T obj, Exception e) {
if (obj == null) {
throw e;
}
return obj;
}

利用 OrThrow 扩展方法,则之前的调用方式可以修改为:

Customer customer = new CustomerDAL().FindCustomers(Role.Admin).OrThrow(new MyException(“Can’t find Customer”)).First();

Craig Andera 提出:

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

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

return obj;
}

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

通过 Instance 扩展方法,可以安全地调用 List 的相关属性和方法,例如 Count 属性:
Console.WriteLine(new ListObject().Foo().Instance().Count);

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

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

2009-03-27 21:492015
用户头像

发布了 109 篇内容, 共 45.3 次阅读, 收获喜欢 14 次。

关注

评论

发布
暂无评论
发现更多内容

HarmonyOS NEXT带来的DevEco Profiler助您轻松分析应用性能问题

极客天地

华为云ROMA Connect亮相Gartner®全球应用创新及商业解决方案峰会,助力企业应用集成和数字化转型

云计算 华为云 峰会

2023百度教育再出发,探索经营增长新空间

彭飞

GLTF-pipeline

3D建模设计

gltf编辑器

预告!网络安全红队GPT大模型训练直播来袭

云起无垠

区块链集成:加密货币网站开发的必备条件

区块链软件开发推广运营

数字藏品开发 dapp开发 区块链开发 链游开发 NFT开发

反驳来了!放弃TypeScript?说明你无知!

树上有只程序猿

typescript 代码质量 js

医院如何实现安全又稳定的跨网文件数据交换呢?

镭速

跨网文件数据交换

国产化操作系统有哪些?适配国产化操作系统堡垒机哪款好用?

行云管家

信创 堡垒机 国产化 国产操作系统 国产

GLTF文件格式解析与预览、编辑

3D建模设计

GLTF

如何将 OBJ 模型转换和压缩为 GLTF 以与 AWS IoT TwinMaker 配合使用

3D建模设计

GLTF

华为云CodeArts Check代码检查服务用户声音反馈集锦(1)

云计算 软件开发 华为云

5 个适合出海离岸公司的地区推荐

出海的猹

出海企业

创新生产力的新引擎

百度开发者中心

#人工智能 生成式AI 文心一言

基于YOLOv2和传感器的多功能门禁系统

timerring

YOLOv2

OpenCloudOS + 英特尔第四代至强处理器:完美适配,加速未来

OpenCloudOS

Linux intel

用友BIP资产云携手洋井石化,打造行业领先的智慧资产管理系统

用友BIP

资产云

生成式AI的发展与内容质量及安全性的挑战

百度开发者中心

#人工智能 生成式AI 文心一言 千帆大模型平台

HarmonyOS应用侧与前端页面数据通道建立

HarmonyOS开发者

HarmonyOS

北京大上科技发布全球首款25.3英寸彩色墨水屏显示器

硬科技星球

华秋亮相第五届模拟半导体大会,助力电子行业高质量发展

华秋电子

PCB

创新力量重塑生产力

百度开发者中心

文学 #人工智能 生成式AI 文心一言

如何在Blender中压缩/减小GLTF模型的大小

3D建模设计

blender GLTF

解决方案| anyRTC远程检修应用场景

anyRTC开发者

人工智能 音视频 视频会议 远程协助 电话会议

9.19-21,openEuler与您相约2023欧洲开源峰会

openEuler

Linux 开源 操作系统 openEuler

莆田市属于哪个省?有正规等保测评机构吗?

行云管家

等保 等保测评 等保等级保护

运行程序提示路径错误?

矩视智能

深度学习 机器视觉

glTF 中基于物理的渲染(PBR)

3D建模设计

“敏捷教练必修课程”10月14-15日 ·A-CSM认证在线周末班【提前报名特惠】CST导师亲授

ShineScrum

使用扩展方法对调用进行验证_.NET_张逸_InfoQ精选文章