国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

擴(kuò)展方法的幾個實例,擴(kuò)展基本類型、接口、通過反射讓擴(kuò)展方法使用私有成員等

2019-11-17 03:01:56
字體:
供稿:網(wǎng)友

擴(kuò)展方法的幾個實例,擴(kuò)展基本類型、接口、通過反射讓擴(kuò)展方法使用私有成員等

.net擴(kuò)展方法可以擴(kuò)展很多類型,包括:基本數(shù)據(jù)類型、接口、類,等等。如果,需要擴(kuò)展的類型包含私有成員,擴(kuò)展方法如何運(yùn)用這些私有成員呢?本篇逐一體驗,包括:

■ 擴(kuò)展基本數(shù)據(jù)類型■ 擴(kuò)展接口■ 擴(kuò)展包含私有字段的類 使用反射獲取類的私有字段■ 擴(kuò)展一個類的私有嵌套類 通過反射

擴(kuò)展方法有幾個必要前提:● 擴(kuò)展方法所在的類必須是靜態(tài)類● 擴(kuò)展方法本身必須是靜態(tài)方法● 擴(kuò)展方法參數(shù)中,對類型的擴(kuò)展參數(shù)前必須加this關(guān)鍵字

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

針對DateTime類型寫一個擴(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("請輸入正確的出生日期~~");            }            else            {                return currentYear - birthYear - 1;            }        }    }

客戶端調(diào)用。

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("您當(dāng)前的年齡是:{0}", age);                Console.ReadKey();            }            catch (Exception ex)            {                Console.WriteLine(ex.Message);            }        }    }
1

擴(kuò)展接口

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

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

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

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

接口有2個實現(xiàn)類。

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)"}            };        }    }

針對接口擴(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("食物類別下總數(shù)量是;{0}", productService.GetProducts().Count());            try            {                Console.WriteLine("找到的產(chǎn)品名稱是:{0}", (productService.GetProductsById(1).SingleOrDefault()).Name);            }            catch (Exception ex)            {                Console.WriteLine(ex.Message);            }            Console.ReadKey();        }    }

2

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

擴(kuò)展一個類的時候,有時候會用到該類的私有字段,我們可以通過反射拿到類的私有字段。

有這樣的一個類,包含私有字段和公共方法。

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

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

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";            }        }    }

客戶端調(diào)用。

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();        }    }

3

擴(kuò)展一個類的私有嵌套類 通過反射

當(dāng)一個類有嵌套私有類的時候,擴(kuò)展該類的時候,有時候會用到該類的嵌套私有類,我們可以通過反射擴(kuò)展私有嵌套類。

有這樣的一個ParentClass類,包含一個私有嵌套類ChildClass.

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

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

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類型,然后運(yùn)用私有嵌套類的擴(kuò)展方法。

try            {                ParentClass p = new ParentClass();                //通過反射獲取父類私有嵌套類                var privateClass = typeof (ParentClass).GetNestedType("ChildClass", BindingFlags.NonPublic);                //通過反射創(chuàng)建父類私有嵌套類的實例                var c =
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 文昌市| 定日县| 嘉荫县| 荆门市| 宁武县| 晋州市| 乐安县| 丰宁| 肥东县| 静宁县| 文安县| 卫辉市| 独山县| 尼木县| 聂拉木县| 海晏县| 乐业县| 铜鼓县| 延吉市| 吉安市| 上杭县| 稷山县| 中江县| 浦北县| 新巴尔虎右旗| 广宗县| 蕲春县| 哈密市| 灵丘县| 斗六市| 辽源市| 洞头县| 鸡东县| 富宁县| 湘潭县| 汉阴县| 保德县| 肇州县| 逊克县| 贵港市| 钟山县|