欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2022年08月13日 11:54:15   作者:Darren?Ji  
本文詳細(xì)講解了.NET的擴(kuò)展方法的使用,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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

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

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

針對(duì)DateTime類型寫一個(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)類。

    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("食物類別下總數(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();
        }
    }

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

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

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

    {
        private DateTime _currentTime;

        public void SetTime()
        {
            _currentTime = DateTime.Now;
        }

        public string GetMsg()
        {
            if (_currentTime.Hour < 12)
            {
                return "上午好~~";
            }
            else
            {
                return "下午好~~";
            }
        }
    }

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

    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("來自中國(guó)的問候是:{0}", displayMessage.GetMsg());
            Console.WriteLine("美國(guó)人怎么問候?");
            Console.WriteLine("來自美國(guó)的問候是:{0}", displayMessage.GetLocalMsg("USA"));
            Console.ReadKey();
        }
    }

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

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

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

    public class ParentClass
    {
        public string MessageFromParent()
        {
            return "from parent~~";
        }

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

現(xiàn)在要擴(kuò)展這個(gè)私有嵌套類,為其添加一個(gè)轉(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)建父類私有嵌套類的實(shí)例
    var c = Activator.CreateInstance(privateClass);

    //通過反射獲取父類私有嵌套類的方法
    //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)鏈接

相關(guān)文章

最新評(píng)論