av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

.NET擴(kuò)展方法使用實(shí)例詳解

瀏覽:135日期:2022-06-08 14:23:31

擴(kuò)展方法有幾個(gè)必要前提:

  • 擴(kuò)展方法所在的類(lèi)必須是靜態(tài)類(lèi)
  • 擴(kuò)展方法本身必須是靜態(tài)方法
  • 擴(kuò)展方法參數(shù)中,對(duì)類(lèi)型的擴(kuò)展參數(shù)前必須加this關(guān)鍵字

擴(kuò)展基本數(shù)據(jù)類(lèi)型

針對(duì)DateTime類(lèi)型寫(xiě)一個(gè)擴(kuò)展方法。

    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("請(qǐng)輸入正確的出生日期~~");    }    else    {return currentYear - birthYear - 1;    }}    }

客戶端調(diào)用。

    class Program    {static void Main(string[] args){    try    {Console.WriteLine("請(qǐng)輸入您的出生年份");DateTime d = Convert.ToDateTime(Console.ReadLine());DateTime dateInstance = new DateTime();int age = dateInstance.Age(d);Console.WriteLine("您當(dāng)前的年齡是:{0}", age);Console.ReadKey();    }    catch (Exception ex)    {Console.WriteLine(ex.Message);    }}    }

擴(kuò)展接口

有這樣的一個(gè)產(chǎn)品模型。

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

接口提供獲取產(chǎn)品集合的方法。

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

接口有2個(gè)實(shí)現(xiàn)類(lèi)。

    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 = "電風(fēng)扇"},new Product(){Id = 4, Name = "空調(diào)"}    };}    }

針對(duì)接口擴(kuò)展方法。

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

客戶端調(diào)用。

    class Program    {static void Main(string[] args){    IProductService productService = new FoodProducts();    Console.WriteLine("食物類(lèi)別下總數(shù)量是;{0}", productService.GetProducts().Count());    try    {Console.WriteLine("找到的產(chǎn)品名稱(chēng)是:{0}", (productService.GetProductsById(1).SingleOrDefault()).Name);    }    catch (Exception ex)    {Console.WriteLine(ex.Message);    }    Console.ReadKey();}    }

擴(kuò)展包含私有字段的類(lèi) 使用反射獲取類(lèi)的私有字段

擴(kuò)展一個(gè)類(lèi)的時(shí)候,有時(shí)候會(huì)用到該類(lèi)的私有字段,我們可以通過(guò)反射拿到類(lèi)的私有字段。

有這樣的一個(gè)類(lèi),包含私有字段和公共方法。

    {private DateTime _currentTime;public void SetTime(){    _currentTime = DateTime.Now;}public string GetMsg(){    if (_currentTime.Hour < 12)    {return "上午好~~";    }    else    {return "下午好~~";    }}    }

我們希望擴(kuò)展出一個(gè)顯示英文信息的問(wèn)候。

    public static class DisplayMessageExtensions    {public static string GetLocalMsg(this DisplayMessage message, string country){    //通過(guò)反射拿到私有字段    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";    }}    }

客戶端調(diào)用。

    class Program    {static void Main(string[] args){    DisplayMessage displayMessage = new DisplayMessage();    displayMessage.SetTime();    Console.WriteLine("來(lái)自中國(guó)的問(wèn)候是:{0}", displayMessage.GetMsg());    Console.WriteLine("美國(guó)人怎么問(wèn)候?");    Console.WriteLine("來(lái)自美國(guó)的問(wèn)候是:{0}", displayMessage.GetLocalMsg("USA"));    Console.ReadKey();}    }

擴(kuò)展一個(gè)類(lèi)的私有嵌套類(lèi) 通過(guò)反射

當(dāng)一個(gè)類(lèi)有嵌套私有類(lèi)的時(shí)候,擴(kuò)展該類(lèi)的時(shí)候,有時(shí)候會(huì)用到該類(lèi)的嵌套私有類(lèi),我們可以通過(guò)反射擴(kuò)展私有嵌套類(lèi)。

有這樣的一個(gè)ParentClass類(lèi),包含一個(gè)私有嵌套類(lèi)ChildClass.

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

現(xiàn)在要擴(kuò)展這個(gè)私有嵌套類(lèi),為其添加一個(gè)轉(zhuǎn)換成大寫(xiě)的方法,通過(guò)反射來(lái)完成。

    public static class NestedClassExtension    {public static string ToUppeerCaseParentMessage(this ParentClass parent){    return parent.MessageFromParent().ToUpper();}public static string ToUpperCaseChildMessage(this object o){    var childUpper = "";    //通過(guò)反射獲取父類(lèi)中的私有嵌套類(lèi)    var privateClass = typeof (ParentClass).GetNestedType("ChildClass", BindingFlags.NonPublic);    if (o.GetType() == privateClass)    {//通過(guò)反射獲取嵌套私有類(lèi)的方法var callMethod = privateClass.GetMethod("MessageFromChild");childUpper = (callMethod.Invoke(o, null) as string).ToUpper();    }    return childUpper;}    }

客戶端,首先通過(guò)反射獲取私有嵌套類(lèi)的type類(lèi)型,然后運(yùn)用私有嵌套類(lèi)的擴(kuò)展方法。

try{    ParentClass p = new ParentClass();    //通過(guò)反射獲取父類(lèi)私有嵌套類(lèi)    var privateClass = typeof (ParentClass).GetNestedType("ChildClass", BindingFlags.NonPublic);    //通過(guò)反射創(chuàng)建父類(lèi)私有嵌套類(lèi)的實(shí)例    var c = Activator.CreateInstance(privateClass);    //通過(guò)反射獲取父類(lèi)私有嵌套類(lèi)的方法    //var callMethod = privateClass.GetMethod("MessageFromChild");    Console.WriteLine(c.ToUpperCaseChildMessage());}catch (Exception ex){    Console.WriteLine(ex.Message);   }Console.ReadKey();

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

標(biāo)簽: ASP.NET
相關(guān)文章:
主站蜘蛛池模板: 国产成人精品一区二区三区视频 | 成人精品在线视频 | 国产综合久久久 | 精品久久久久久久久久久久久久久久 | 成人动漫在线观看 | 久久综合99 | 欧美xx孕妇 | 日韩欧美中文字幕在线观看 | 精品免费在线 | 精品久久一区二区三区 | 日韩影院在线观看 | 一级免费毛片 | 天堂成人网 | 国产一区福利 | 国产午夜精品一区二区三区 | 午夜免费小视频 | 蜜臀久久99精品久久久久宅男 | 午夜在线观看免费视频 | 国产视频成人 | 国产欧美日韩在线观看 | 夜夜嗨av一区二区三区网页 | 久草精品视频在线看网站免费 | 中文字幕在线观看日韩 | 一区二区免费在线观看 | 欧美a级成人淫片免费看 | 大尺度做爰呻吟舌吻网站 | 特大黑人巨交吊性xxxx视频 | www.青青草 | 一级免费av | 成人免费视频国产免费麻豆 | 久久九九免费视频 | 高清乱码男女免费观看 | 久久精品小视频 | 精品小视频 | 天天躁日日躁狠狠躁av麻豆男男 | 天天综合av | 欧美一级做性受免费大片免费 | 四虎官网| 看一级黄色片 | 亚洲国产精品一区二区三区 | 毛片在线观看网站 |