<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
擴充套件方法有幾個必要前提:
針對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();
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對it145.com的支援。如果你想了解更多相關內容請檢視下面相關連結
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45