C#——lambda表达式和反射
生活随笔
收集整理的這篇文章主要介紹了
C#——lambda表达式和反射
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Lambda表達式的演化——從這個演化過程我們能夠更進一步理解這個表達式的好處(減少代碼書寫)
為了更好的了解lambda表達式,需要先了解委托,其次是匿名函數——
匿名方法:提供了一種傳遞代碼塊作為委托
參數的技術。匿名方法是沒有名稱只有主體的方法。 在匿名方法中您不需要指定返回類型,它是從方法主體內的 return 語句推斷的。
在主函數中創建如下聲明delegate void ShowMsg();//不帶返回 無參delegate int Add(int x, int y); //創建如下方法——public class DelegateClass{public int AddNew(int a, int b){int c = a + b;return c;}public void ShowMsg(){Console.WriteLine("顯示方法");} }之后的測試函數
ShowMsg show=delegate(){Console.writeLine("匿名方法");};這個就是匿名方法——它不直接指定方法體名稱,只有具體的方法在。
于是有以下演化過程——
? //第一種方法,我們可以這么寫 Add add1=delegate(int x ,int y){ int c=x+y; return c; };//第二種方法,如果我們不用delegate呢?于是將delegate變成=> Add add2=(int x,int y)=>{ int c=x+y; return c; };//第三種方法,如果我們不要指定參數類型可不可以? Add add3=(x,y)=>{ int c=x+y; return c; }//第四種,還可不可簡化? Add add4=(x,y)=>x+y;//這個就是Lambda表達式了 //我們還可以這么做 add4+=(x,y)=>(x+y)*x;add4+=(x,y)=>(x-y)*x;//在使用的時候,一般得到的結果是最后一個的結果比如 int result=add4(1,2);//結果為-1,而不是3.?以上就是簡單的lambda表達式。
反射的內容——
反射是程序可以訪問、檢測和修改它本身狀態或行為的一種能力。通過反射可以在運行時獲取到程序或程序集的每一個類型(類、結構、委托和接口等)
反射常用的方法——
#region 反射//相關命名空間 類 System.Reflection Type Assembly//作用,獲取程序或程序集中每個類型的信息//1、創建對象UserInfo userInfo = new UserInfo();//此為直接創建//2、假如不直接創建呢?Type type = typeof(UserInfo);//獲取類型的Type對象UserInfo user1 = Activator.CreateInstance<UserInfo>();//用來創建對象實例UserInfo user2 = (UserInfo)Activator.CreateInstance(type);//使用默認構造函數創建實例//獲取類成員var properties = type.GetProperties();//所有的公有屬性PropertyInfo proId = type.GetProperty("UserID");var fields = type.GetFields();//獲取公有字段var priFields = type.GetFields(BindingFlags.Instance|BindingFlags.NonPublic);//獲取私有字段,一般不用//獲取方法var publicMethod = type.GetMethods();//獲取所有公共方法//通過反射的方法獲取方法并調用(以下為調用有參方法object user4 = Activator.CreateInstance(type);MethodInfo mShow = type.GetMethod("Show", new Type[] { });mShow.Invoke(user4, null);//參數沒有就傳null//帶參數的方法的調用MethodInfo mShow1 = type.GetMethod("Show", new Type[] {typeof(UserInfo) });mShow1.Invoke(user4, new object[] { userInfo });//靜態方法的獲取,和上例一樣,有參就傳參數,然后調用的時候是實例方法的調用MethodInfo mShowstatic = type.GetMethod("ShowInfo", new Type[] { });mShowstatic.Invoke(null,null);//獲取構造函數var constructor = type.GetConstructors();//所有的公共構造函數ConstructorInfo cons1 = type.GetConstructor(new Type[] { });//無參UserInfo user6 =(UserInfo) cons1.Invoke(null);//調用有參構造函數的方法ConstructorInfo cons2 = type.GetConstructor(new Type[] { typeof(int), typeof(string) });object user7= cons2.Invoke(userInfo, new object[] { 12, "干" });//加載程序集//三種方式——//1、Load() dll/exe 文件名不加后綴,需要將dll文件放到啟動文件的debug下// Assembly assembly = Assembly.Load("Models");//加載程序集//3\、LoadFrom()程序集名稱 帶DLL后綴Assembly assembly = Assembly.LoadFrom("Models.dll");Type typeMenu = assembly.GetType("Models.UserInfo");//類的完整名稱 命名空間+類名//創建對象實例object userInfo1 = Activator.CreateInstance(typeMenu);//寫屬性值typeMenu.GetProperty("UserID").SetValue(userInfo1,5);//讀屬性值foreach(var p in typeMenu.GetProperties()){object objVal = p.GetValue(userInfo1);if (objVal != null){Console.WriteLine(objVal.ToString());}}//2、LoadFile()dll 文件的絕對路徑(一般不用)//讀寫屬性值#endregion總結
以上是生活随笔為你收集整理的C#——lambda表达式和反射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android播放系统音效,Androi
- 下一篇: C#语言实例源码系列-远程关闭和重启计算