今天小编给大家分享一下.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();
以上就是“.NET扩展方法如何使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。