文章詳情頁
.NET擴展方法使用實例詳解
瀏覽:76日期:2022-06-08 14:23:31
擴展方法有幾個必要前提:
- 擴展方法所在的類必須是靜態類
- 擴展方法本身必須是靜態方法
- 擴展方法參數中,對類型的擴展參數前必須加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
相關文章:
1. ASP.NET MVC視圖頁使用jQuery傳遞異步數據的幾種方式詳解2. .Net6.0+Vue3實現數據簡易導入功能全過程3. ASP.NET 2.0頁面框架的幾處變化4. .NET Core中RabbitMQ使用死信隊列的實現5. ASP.NET MVC使用Boostrap實現產品展示、查詢、排序、分頁6. ASP.NET MVC實現城市或車型三級聯動7. 使用.net core 自帶DI框架實現延遲加載功能8. 在Asp.net core項目中使用WebSocket9. ASP.NET泛型三之使用協變和逆變實現類型轉換10. ASP.NET MVC實現單個圖片上傳、限制圖片格式與大小并在服務端裁剪圖片
排行榜
