.NET扩展方法使用实例详解_实用技巧

来源:脚本之家  责任编辑:小易  

扩展方法有几个必要前提:

扩展方法所在的类必须是静态类扩展方法本身必须是静态方法扩展方法参数中,对类型的扩展参数前必须加this关键字

扩展基本数据类型

针对DateTime类型写一个扩展方法。

    public static class CalculateAge
    {
        public static int Age(this DateTime date, DateTime birthDate)
        {
            int birthYear = birthDate.Year;
            int currentYear = DateTime.Now.Year;
            if (birthYear >= currentYear)
            {
                throw new Exception("请输入正确的出生日期~~");
            }
            else
            {
                return currentYear - birthYear - 1;
            }
        }
    }

客户端调用。

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("请输入您的出生年份");
                DateTime d = Convert.ToDateTime(Console.ReadLine());
                DateTime dateInstance = new DateTime();
                int age = dateInstance.Age(d);
                Console.WriteLine("您当前的年龄是:{0}", age);
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }

扩展接口

有这样的一个产品模型。

    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

接口提供获取产品集合的方法。

    public interface IProductService
    {
        IEnumerable<Product> GetProducts();
    }

接口有2个实现类。

    public class FoodProducts : IProductService
    {
        public IEnumerable<Product> GetProducts()
        {
            return new List<Product>
            {
                new Product(){Id = 1, Name = "饼干"},
                new Product(){Id = 2, Name = "牛奶"}
            };
        }
    }

    public class ElectronicProducts : IProductService
    {
        public IEnumerable<Product> GetProducts()
        {
            return new List<Product>
            {
                new Product(){Id = 3, Name = "电风扇"},
                new Product(){Id = 4, Name = "空调"}
            };
        }
    }

针对接口扩展方法。

    public static class ProductServiceExtension
    {
        public static IEnumerable<Product> GetProductsById(this IProductService productService, int id)
        {
            return productService.GetProducts().Where(p => p.Id == id);
        }
    }

客户端调用。

    class Program
    {
        static void Main(string[] args)
        {
            IProductService productService = new FoodProducts();
            Console.WriteLine("食物类别下总数量是;{0}", productService.GetProducts().Count());
            try
            {
                Console.WriteLine("找到的产品名称是:{0}", (productService.GetProductsById(1).SingleOrDefault()).Name);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
        }
    }

扩展包含私有字段的类 使用反射获取类的私有字段

扩展一个类的时候,有时候会用到该类的私有字段,我们可以通过反射拿到类的私有字段。

有这样的一个类,包含私有字段和公共方法。

    {
        private DateTime _currentTime;

        public void SetTime()
        {
            _currentTime = DateTime.Now;
        }

        public string GetMsg()
        {
            if (_currentTime.Hour < 12)
            {
                return "上午好~~";
            }
            else
            {
                return "下午好~~";
            }
        }
    }

我们希望扩展出一个显示英文信息的问候。

    public static class DisplayMessageExtensions
    {
        public static string GetLocalMsg(this DisplayMessage message, string country)
        {
            //通过反射拿到私有字段
            var privateField = typeof (DisplayMessage).GetField("_currentTime",
                BindingFlags.Instance | BindingFlags.NonPublic);

            //获取该私有字段的值
            var currentDateTime = (DateTime)privateField.GetValue(message);
            if (country == "USA" && currentDateTime.Hour < 12)
            {
                return "Good Morning";
            }
            else
            {
                return "Good Evening";
            }
        }
    }

客户端调用。

    class Program
    {
        static void Main(string[] args)
        {
            DisplayMessage displayMessage = new DisplayMessage();
            displayMessage.SetTime();
            Console.WriteLine("来自中国的问候是:{0}", displayMessage.GetMsg());
            Console.WriteLine("美国人怎么问候?");
            Console.WriteLine("来自美国的问候是:{0}", displayMessage.GetLocalMsg("USA"));
            Console.ReadKey();
        }
    }

扩展一个类的私有嵌套类 通过反射

当一个类有嵌套私有类的时候,扩展该类的时候,有时候会用到该类的嵌套私有类,我们可以通过反射扩展私有嵌套类。

有这样的一个ParentClass类,包含一个私有嵌套类ChildClass.

    public class ParentClass
    {
        public string MessageFromParent()
        {
            return "from parent~~";
        }

        private class ChildClass
        {
            public string MessageFromChild()
            {
                return "from child~";
            }
        }
    }

现在要扩展这个私有嵌套类,为其添加一个转换成大写的方法,通过反射来完成。

    public static class NestedClassExtension
    {
        public static string ToUppeerCaseParentMessage(this ParentClass parent)
        {
            return parent.MessageFromParent().ToUpper();
        }

        public static string ToUpperCaseChildMessage(this object o)
        {
            var childUpper = "";

            //通过反射获取父类中的私有嵌套类
            var privateClass = typeof (ParentClass).GetNestedType("ChildClass", BindingFlags.NonPublic);

            if (o.GetType() == privateClass)
            {
                //通过反射获取嵌套私有类的方法
                var callMethod = privateClass.GetMethod("MessageFromChild");
                childUpper = (callMethod.Invoke(o, null) as string).ToUpper();
            }
            return childUpper;
        }
    }

客户端,首先通过反射获取私有嵌套类的type类型,然后运用私有嵌套类的扩展方法。

try
{
    ParentClass p = new ParentClass();

    //通过反射获取父类私有嵌套类
    var privateClass = typeof (ParentClass).GetNestedType("ChildClass", BindingFlags.NonPublic);

    //通过反射创建父类私有嵌套类的实例
    var c = Activator.CreateInstance(privateClass);

    //通过反射获取父类私有嵌套类的方法
    //var callMethod = privateClass.GetMethod("MessageFromChild");
    Console.WriteLine(c.ToUpperCaseChildMessage());
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);   
}
Console.ReadKey();

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对真格学网的支持。如果你想了解更多相关内容请查看下面相关链接

您可能感兴趣的文章:ASP.NET MVC扩展HtmlHelper方法.NET实用扩展方法详解asp.net中CSharpThinking扩展方法分析ASP.NET导出Excel打开时提示:与文件扩展名指定文件不一致解决方法使用Asp.net Mvc3 Razor视图方式扩展JQuery UI Widgets方法介绍

  • 本文相关:
  • 把.net core 项目迁移到vs2019 for mac的方法步骤
  • 解决iis7.5服务器上.net 获取不到https页面的信息
  • asp.net gridview的bootstrap分页样式
  • asp.net(c#)动态修改webservice的地址和端口(动态修改配置文件)
  • 在asp.net中为图像加入水印信息并保存为jpg类型
  • .net core创建一个控制台(console)程序
  • .net微信公众号开发之公众号消息处理
  • 如何利用fluentmigrator实现数据库迁移
  • asp.net使用ajax实现无刷新分页
  • global.asax的application_beginrequest实现url重写无后缀的代码
  • vlookup函数的使用方法及实例是什么?
  • PHP使用zlib扩展实现GZIP压缩输出的方法详解
  • mysql修改表结构方法实例详解
  • JavaScript函数内部属性和函数方法实例详解
  • JavaScript中十种一步拷贝数组的方法实例详解
  • 如何使用Log4net创建日志及简单扩展
  • ES6的解构赋值实例详解
  • JavaScript 扩展运算符用法实例小结【基于ES6】
  • 判断js数据类型的函数实例详解
  • JavaScript中扩展Array contains方法实例
  • PHP7扩展开发之hello word实现方法详解
  • Yii扩展组件编写方法实例分析
  • jQuery扩展方法实现Form表单与Json互相转换的实例代码
  • jQuery解析Json实例详解
  • 如何为jquery扩展静态和实例方法
  • mysql中workbench实例详解
  • JavaScript命名空间模式实例详解
  • vlookup函数的使用方法及实例有什么?
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.netasp.net mvc扩展htmlhelper方法.net实用扩展方法详解asp.net中csharpthinking扩展方法分析asp.net导出excel打开时提示:与文件扩展名指定文件不一致解决方法使用asp.net mvc3 razor视图方式扩展jquery ui widgets方法介绍把.net core 项目迁移到vs2019 for mac的方法步骤解决iis7.5服务器上.net 获取不到https页面的信息asp.net gridview的bootstrap分页样式asp.net(c#)动态修改webservice的地址和端口(动态修改配置文件)在asp.net中为图像加入水印信息并保存为jpg类型.net core创建一个控制台(console)程序.net微信公众号开发之公众号消息处理如何利用fluentmigrator实现数据库迁移asp.net使用ajax实现无刷新分页global.asax的application_beginrequest实现url重写无后缀的代码未将对象引用设置到对象的实例 (system.nullrefjava正则表达式 pattern和matcherasp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它的某一个依赖项。试图加载格asp.net中的几种弹出框提示基本实现方法asp.net“服务器应用程序不可用” 解决方法asp.net gridview 72般绝技asp.net生成excel并导出下载五种实现方法system.runtime.interopservicesasp.net对路径"xxxxx"的访问bootstrap blazor项目模板安装extaspnet gridpanel的一般用法javascript 直接调用服务器c#代码 asp.net ajax实例jquery+asp.net实现省市二级联动功能的方法asp.net 时间类 一周的周一和周末的日期详解mvc使用jsonresult返回json数据防止在服务器处理完成之前用户多次点击提交按钮处理代码理解asp.net core 中间件(middleware)创建一个asp.net mvc5项目的实现方法(图文)asp.net 根据汉字的拼音首字母搜索数据库(附 linq 调用方法)
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved