c#的Extension Method功能

要在C#中使用类型的拓展方法,可在一个类中中通过指定static的方法,将Type通过this方式作为第一个参数传入,如给Random增加一个NextFloat方法

    public static class Extension
    {
        public static byte[] NextBytes(this Random r, int length)
        {
            var data = new byte[length];
            r.NextBytes(data);
            return data;
        }

        public static float NextFloat(this Random r, int length)
        {
            return BitConverter.ToSingle(NextBytes(r, 4), 0);
        }
    }

如果拓展的函数和原函数重名的话,则在类以外不产生效果。如上述的NextBytes在Extension外是不生效的。

要实现该效果,有三点要求:

1. 声明该拓展方法的Class必须是static、non-generic和non-nested的

2. 拓展方法必须是static

3. 类型的传入参数必须位于第一个,且以this标明

时间: 2024-11-05 19:00:48

c#的Extension Method功能的相关文章

Extension Method[下篇]

四.Extension Method的本质 通过上面一节的介绍,我们知道了在C#中如何去定义一个Extension Method:它是定义在一个Static class中的.第一个Parameter标记为this关键字的Static Method.在这一节中,我们来进一步认识Extension Method. 和C# 3.0的其他新特性相似,Extension Method仅仅是C#这种.NET Programming Language的新特性而已.我们知道,C#是一种典型的编译型的语言,我们编

Extension Method[上篇]

在C#3.0中,引入了一些列新的特性,比如: Implicitly typed local variable, Extension method,Lambda expression, Object initializer, Anonymous type, Implicitly typed array, Query expression, Expression tree. 个人觉得在这一系列新特性的,最具创新意义的还是Extension method,它从根本上解决了这样的问题:在保持现有Type

扩展Unity3d 组件方法,简化API使用 - C#特性之 Extension Method

在日常使用Unity3d中,经常碰到一些简单操作但是代码却很长的问题,比如变换一个 GameObject的 Y 位置,会按照下面的写法: transform.localPosition = new Vector3 (transform.localPosition.x, transform.localPosition.y + 100, transform.localPosition.z); 转自http://blog.csdn.net/huutu http://www.thisisgame.com

Swift protocol extension method is called instead of method implemented in subclass

protocol MyProtocol { func methodA() func methodB() } extension MyProtocol { func methodA() { print("Default methodA") } func methodB() { methodA() } } // Test 1 class BaseClass: MyProtocol { } class SubClass: BaseClass { func methodA() { print(

C# 扩展方法Extension Method

C# .NET Framewoke 3.0就引入的新特性,提供了扩展.NET类方法的途径,可以增加代码的美观性! 编写扩展方法有下面几个要求: 扩展方法所在的类必须是全局的,不能是内部嵌套类, 扩展方法的类必须是静态类. 扩展方法必须是静态方法. 扩展方法的第一个参数的数据类型必须是要扩展类型且使用this关键字. 扩展方法定义: public static class CExLongMethed { //无参无返回值 public static void Print(this long l)

Extension method for type

扩展其实真的很简单 msdn是这样规定扩展方法的:"扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的. 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀." 扩展方法的关键不在于定义所在的class的名字,关键在于扩展方法的第一个参数,以及所有class和扩展方法是否为static. 扩展方法的第一个参数指定这个扩展方法作用在的class. 比如我的例子中为string添加一个扩展方法 (ToIntExt), 所以第一个方法必须是string类

Extension Methods(扩展方法)

在 OOPL 中,有静态方法.实例方法和虚方法,如下: public sealed class String { public static bool  IsNullOrEmpty(string s) { // ... } public string Replace(string old, string new) { // ... } } public abstract class Stream { public virtual void WriteByte(byte value) { // .

.NET跨平台之旅:增加文件日志功能遇到的挫折

在将我们的ASP.NET 5示例站点(about.cnblogs.com)升级至ASP.NET 5 RC1的时候,我们增加了控制台日志功能. 在ASP.NET 5添加日志功能很简单,只需在project.json中添加Microsoft.Extensions.Logging.Console的引用: "dependencies":{ "Microsoft.Extensions.Logging.Console": "1.0.0-*" } 并且在 St

MVC学习6 学习使用Code First Migrations功能 把Model的更新同步到DB中

 参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-the-movie-model-and-table 转:http://www.it165.net/pro/html/201403/10653.html 本文内容: 1,学习Entity Framework Code First 迁移功能(Migrations) 2,更新Model Class(Model