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