原本,我听说 Partial Class 的时候,以为可以为已存在的类添加方法了,不过,Partial Class 只能在同一个 Assembly 之中的要求,使得它并不能实现这一点。.Net 3.5 增加了很多语言特性,扩展方法是其中一个。用扩展方法,我们就可以为已经存在的类添加方法。
c# 代码
- public static class ExtendTest
- {
- public static Print(this object o)
- {
- Console.WriteLine(o);
- }
- }
之后,就可以对于任意的 object 使用这个方法:
c# 代码
- string s = "hello";
- s.Print();
- "X".Print();
- MyClass x = new MyClass();
- x.Print();
对于扩展方法的创建,基本上,只有两点记住就可以了:必须是静态方法,第一个参数增加 this 关键字。
用 Reflector 查看了一下,和我的猜测基本一致,其实它的实现是使用的自定义属性,所以扩展方法基本上可以看成是编译器特性:
c# 代码
- public static class ExtendTest
- {
- [ Extend ]
- public static Print(object o)
- {
- Console.WriteLine(o);
- }
- }
扩展方法很好用,使用上确实可以和动态语言像 Python、Ruby 之类的相比了。不过,毕竟 C# 是静态语言,扩展方法还是有一些限制的。
一个限制是:不能使用原有类的私有或保护成员。这个问题,怎么说呢,大部分情况下没有问题,不过如果真的想使用私有或保护成员的时候,会很头疼。如果要给 .Net framework 中的类添加方法,这个问题也许并不是太大吧,毕竟一般我们也只知道它们的公有成员。如果要给自己的 DLL 添加一个新的 DLL,也做到原有 DLL 用于 .Net 2.0,新 DLL 扩展原 DLL 的话,比较会遇到。我在 DbEntry.Net 中对于这个问题的解决方案是,使用友元程序集。这种方法还是需要修改原 DLL,添加新 DLL 为友元程序集,另外,将需要访问的成员标注为 internal 才行。
另一个限制:不能给一个类添加静态方法。不知道是不是我没有找到,反正感觉,本来就是静态方法了,怎么才能再标注为实现静态方法呢?难道用 static static ?当然,使用的场景应该也不多吧。
再一个限制:不能给一个类添加接口。这个么,本来就不是扩展方法的设计目标,而且,实现上似乎也会麻烦很多,所以本来不该抱怨,不过,如果能实现的话,确实会有很多地方会很方便。比如,如果能给 DbObjectModel 添加 IQueryable 接口,就可以只通过增加一个 using 而实现所有的 Linq 功能,而有这个限制的时候,只能再实现一个 LinqDbObjectModel 之类的了……
我发现的,就这3个限制,其它方面,都实现的很好,IDE 提示也很舒服
分享到:
相关推荐
这本书旨在帮助开发者全面掌握ASP.NET 3.5平台,从基础到高级,由浅入深地讲解了各种开发技巧和实践方法。 1. ASP.NET 3.5概述:ASP.NET 3.5是微软.NET Framework 3.5的一部分,它在.NET Framework 2.0的基础上进行...
ASP.NET 3.5是在ASP.NET 2.0基础上的重大更新,引入了对.NET Framework 3.5的支持,其中包括了LINQ、扩展的AJAX功能和新的控件库。它提供了一种声明性、事件驱动的编程模型,让开发者能够用更接近自然语言的方式来...
这个整合版特别针对.NET 3.5进行了优化,这意味着即便是在Windows 7这样的较旧操作系统上,开发者也能利用最新的Web渲染技术构建应用程序。 CefGLue的核心功能在于提供了一个方便的API,让开发者能够轻松地与...
首先,C# 3.0的重要更新包括匿名类型、lambda表达式、LINQ(Language Integrated Query)和扩展方法。匿名类型允许在不定义新类的情况下创建临时对象,这在处理数据查询时非常方便。Lambda表达式简化了编写短小的...
ASP.NET 3.5是微软开发的一个Web应用程序框架,它基于.NET Framework 3.5,为Web开发提供了更强大、更灵活的工具和API。在这个版本中,ASP.NET引入了许多新特性和改进,使得开发者能够更高效地构建动态网站、Web服务...
"至理:精通ASP.NET3.5网络开发源代码"这个资源很可能是为了帮助学习者深入理解ASP.NET 3.5的编程原理和实践技巧,通过实际的源代码来提升开发能力。 1. **ASP.NET架构**:ASP.NET 3.5基于.NET Framework 3.5,它...
例如,如果你需要使用ASP.NET 3.5,你可能还需要启用IIS相关的Web服务扩展。这可以通过在命令提示符中运行以下命令实现: ``` dism.exe /online /enable-feature /featurename:ASP.NET /All ``` 此外,如果你在...
综上所述,"ASP.NET3.5实用教程"将带你系统地学习ASP.NET 3.5的各个方面,从基础到高级,从理论到实践,旨在培养你成为一名熟练的ASP.NET开发者。通过郑阿奇的课件,你将能够构建出高效、稳定的Web应用程序,满足...
此外,ASP.NET 3.5还扩展了ADO.NET Entity Framework,这是一种ORM(对象关系映射)工具,可以帮助开发者在.NET应用程序中更方便地操作数据库。Entity Framework允许开发者以面向对象的方式来处理数据,减少了与SQL...
3. **C# 2008**:本书使用的编程语言是C#的2008版本,该版本引入了匿名方法、lambda表达式、自动属性、扩展方法等新特性,增强了对LINQ的支持,使得代码更加简洁和高效。 4. **ASP.NET 3.5 Web Forms**:Web Forms...
通过学习《ASP.NET 3.5编程宝典》,开发者不仅可以掌握ASP.NET 3.5的核心技术,还能学习到如何构建高效、可扩展的Web应用程序。书中提供的代码实例是实践和深化理解的宝贵资源,能够帮助读者迅速提升技能,解决实际...
"ASP.NET3.5宝典"很可能是一本详尽的教程或者参考资料,旨在帮助学习者深入理解和掌握ASP.NET 3.5的各项技术。 光盘内容包括了两个大型系统的源代码和数据库,这意味着我们可以从中学习到实际项目中的开发实践。...
此外,ASP.NET 3.5强化了AJAX支持,引入了ASP.NET AJAX Control Toolkit,提供了一系列可扩展的、无需JavaScript基础即可使用的控件和行为。这些示例代码可能包含了使用UpdatePanel、ScriptManager等组件实现异步...
4. **AJAX 支持**:ASP.NET 3.5扩展了对AJAX(Asynchronous JavaScript and XML)的支持,通过AJAX控件工具包,开发者可以创建更具交互性的用户体验,而无需刷新整个页面。 5. **ADO.NET Entity Framework**:这是...
首先,.NET Framework 3.5是基础,它包含了丰富的类库和新的语言特性,如LINQ(Language Integrated Query)和扩展方法,这些都显著提高了开发人员对数据处理的能力。书中会详细介绍如何利用这些新功能进行编程。 ...
3. **AJAX支持**:ASP.NET 3.5扩展了AJAX支持,引入了UpdatePanel、ScriptManager和AJAX Control Toolkit等组件,实现了页面的部分更新,提升了用户体验。源码可能包含使用这些技术实现异步操作的示例。 4. **Web...
1. **ASP.NET 3.5基础**:ASP.NET 3.5在2.0的基础上进行了增强,引入了语言集成查询(Linq)、扩展框架(Extension Framework)和ASP.NET AJAX等新特性。它支持事件驱动的编程模型,使Web开发更接近桌面应用程序的...
3. **扩展方法**:扩展方法是 C# 2008 新增的功能之一,允许开发人员向现有类型添加新方法,而不必修改该类型的定义。 4. **自动实现属性**:简化了属性的声明,无需手动实现 get 和 set 方法。 5. **匿名类型**...
ASP.NET 3.5是.NET Framework 3.5的一部分,它包含了ASP.NET 2.0的所有功能,并新增了一些关键特性,如LINQ(Language Integrated Query)、AJAX支持和扩展的WCF(Windows Communication Foundation)服务。...
其次,ASP.NET 3.5强化了AJAX支持,引入了ASP.NET AJAX Control Toolkit,提供了一系列预构建的AJAX控件和扩展,可以轻松实现页面的部分刷新和增强用户体验。同时,ASP.NET MVC框架也在这个版本中崭露头角,它提供了...