个人理解
今天下午花了三个小时大概学习了一下,我的理解就是,C#通过反射这个特性,可以帮助开发之直接访问到一个对象比如People的内部,可以查看其内部的方法啦、属性啦等。并且在对一个对象的多个(非常多的意思)进行赋值,不需要去new然后一个个=赋值过去了,减少代码量,不仅在一定程度上减少了开发者的工作量,也便于后期维护的人进行查看。
为什么需要反射
-
官方说明:是程序可以访问、检测、修改它本身状态或行为一种能力。
-
通过反射可以直接访问到对象的属性和方法
-
有时不知道具体的类型,可以通过dll去得到类的对象/如果不知道给到的dll里有哪些方法和属性,通过反射可以知道里面内容
-
dll:动态链接库文件,里面放的是各种函数、类、结构体这些。不能独立执行,但是可被调用。
-
在C#里dll相当于一段可调用的代码 相当于 一个 *.cs的代码源文件
-
dll和一般cs的区别:只在于 *.cs的代码可以看到源码,dll看不到
-
-
某些特殊方法,传过来的是泛型类,需要通过反射处理某些特殊的业务
-
通用方法DataTable和List
的相互转化时需要用到反射 -
对于属性执行的操作少可以手动增删改查,但是如果属性数量几十几百甚至更多的时候,从开发和维护角度来说是极其不便的,这时候就需要使用反射了。也就是说,某些情况下,反射优于new
-
要输出多种结构体的多个属性(Id、Name、Score等)的情况下
反射作用
-
允许在运行时查看特性(attribute)信息/查看元数据
-
允许审查集合中的各种类型,以及实例化这些类型
-
允许延迟绑定的方法和属性(property)
-
允许在运行时创建新类型,然后使用这些类型执行一些任务。
反射相关方法
// 要对某一对象进行系修改属性值,首先需要获取其类型,才能再去进行增删改查等操作
People people = new People();
Type type = People.GetType(); //获取类型
type.GetMembers();//得到对象的所有public成员
type.GetProperties(); //得到对象的所有public属性
type.GetFields(); //得到对象的所有public字段
type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); //得到对象的私有成员
type.GetMembers(BindingFlags.Public|BindingFlags.Static); //得到对象的静态成员
……
反射的使用举例
using System;
using System.Diagnostics;
using System.Reflection;
using System.Security.Cryptography;
namespace Practice1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Type people = typeof(People);
Console.WriteLine("class = " + people.Name); // class = People
// Console.WriteLine("class = ",people.Name);
// 这个Name不是属性Name,是指class的名字
Console.WriteLine("namespace = " + people.Namespace); // namespace = Practice1
//Console.WriteLine("namespace = ",people.Namespace);
// Console.ReadKey();
//----------------------------------------------------
PropertyInfo[] peopleInfos = people.GetProperties();
// GetProperties()默认只能获取 标记为 public 的属性集合
foreach (PropertyInfo i in peopleInfos)
{
Console.WriteLine(i.Name);
}
Console.Read();
//----------------------------------------------------
MethodInfo[] methodInfo = people.GetMethods();
foreach (MethodInfo i in methodInfo)
{
Console.WriteLine(i.Name);
}
//----------------------------------------------------
}
}
public class People // public class Custom
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public People() { } // 新增一个 构造函数
public bool Validate(People peopleObj) //新增Validate方法,用于校验入参的合法性
{
//Code to validate the eople object
return true;
}
}
}
输出: