您好,登錄后才能下訂單哦!
今天小編給大家分享一下.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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。