C#通过反射修改字段值方法

反射的概念:

程序正在运行时,可以查看其它程序集或者自身的元数据。
一个运行的程序查看本身或者其它程序的元数据的行为叫做反射。
说的通俗点就是在程序运行时,通过反射可以得到其它程序集或者自己程序集代码的各种信息,包括类、函数、变量等来实例化它们,执行它们,操作它们。

说简单点就是他是操作metadata的一个类库,可以把它当作成一个工具,用来读取或者操作元数据的。像ORM、AOP等都会用到它。

程序集:

程序集是经由编译器编译得到的,供进一步编译执行的中间产物。在Windows系统中,它一般表现为后缀为.dll(库文件)或者.exe(可执行文件)的格式。

元数据:

元数据是用来描述数据的数据。即程序中的类、类中的函数、变量等信息就是程序的元数据。有关程序以及类型的数据被称为元数据,他们保存在程序集中。

下面通过Demo来说:

 通过反射去读取类文件里面的方法以及参数类型,那么我们就可以操作字段方法了,接下来:

 typeof():C#里的一个运算符,可以返回摸个类型的Type对象,也可以返回某个类型名称的字符串。主要用于反射,也可以在运行时获取某个类型的完整信息,比如类的属性和方法。

这里通过typeof()获取泛型类的完整信息,GetProperties()获取所有的属性,GetProperty()获取属性名,最后通过SetValue()和GetValue()对目标对象进行值的修改。

  Library lib1 = new Library() { id = 12, BookName = "小鲤鱼" };
  Library lib2 = new Library() { id = 33, BookName = "小鲨鱼", Pice = 100 };

  var result = Find<Library, Library>(lib1, lib2, new List<string> { "id" });
  Console.WriteLine($@"商品标签为:{result.id},书名为:{result.BookName},价格为:{result.Pice}");
  Console.ReadKey();

 public static T Find<T, S>(T t, S s, List<string> list)
        {
            if (t is null || s is null) return t;

            Type front = typeof(T);
            Type after = typeof(S);
            foreach (var item in front.GetProperties())
            {
                var getAfterPropertie = after.GetProperty(item.Name);
                if (list.Any(aa => aa.Equals(item.Name))) continue;
                if (getAfterPropertie != null) item.SetValue(t, getAfterPropertie.GetValue(s));
            }
            return t;
        }

有何问题还请大佬们多多指教!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值