反射的概念:
程序正在运行时,可以查看其它程序集或者自身的元数据。
一个运行的程序查看本身或者其它程序的元数据的行为叫做反射。
说的通俗点就是在程序运行时,通过反射可以得到其它程序集或者自己程序集代码的各种信息,包括类、函数、变量等来实例化它们,执行它们,操作它们。
说简单点就是他是操作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;
}
有何问题还请大佬们多多指教!