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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matrix Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值