反射是Net提供的动态调用生成对象,动态调用方法的一组类库
新建一个Relection项目,增加一个Model类库如下:
在Model类库新增Student类
public class Student { private int _id; private string _name; private int _age; public Student() { Console.WriteLine("Student Initializtion"); } public int Id { get { return _id; } set { _id = value; } } public string Name { get { return _name; } set { _name = value; } } public int Age { get { return _age; } set { _age = value; } } public void Learn() { Console.WriteLine("Student begin study"); } private void Play() { Console.WriteLine("Student Begin Play"); } public void SetAge(int age) { this._age = age; } }
在Program.cs
class Program { static void Main(string[] args) { //读取Model类库 var model = Assembly.Load("Model"); Console.WriteLine("*************Modules**************"); foreach (var item in model.GetModules())//获取模块 { Console.WriteLine(item.FullyQualifiedName); } Console.WriteLine("*************Types**************"); foreach (var item in model.GetTypes())//获取所有类型 { Console.WriteLine(item.FullName); } Type type = model.GetType("Model.Student"); Console.WriteLine("*************Properties**************"); foreach (var item in type.GetProperties())//获取所有所有属性 { Console.WriteLine(item.Name); } Console.WriteLine("*************Fields**************"); foreach (var item in type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance))//获取所有所有字段,必须加上BindingFlags.NonPublic | BindingFlags.Instance { Console.WriteLine(item.Name); } Console.WriteLine("*************Methods**************");//获取所有所有方法 foreach (var item in type.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance|BindingFlags.Public)) { Console.WriteLine(item.Name); } Console.WriteLine("*************student**************"); var student = Activator.CreateInstance(type);//创建一个Student对象 Console.WriteLine("*************student Properties**************"); foreach (var item in type.GetProperties())//获取Student所有属性并赋值 { if (item.Name == "Id") item.SetValue(student, 1); if(item.Name=="Name") item.SetValue(student, "cc"); if (item.Name == "Age") item.SetValue(student, 27); Console.WriteLine(item.Name + "=" + item.GetValue(student)); } Console.WriteLine("*************student Methods**************"); foreach (var item in type.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public))//获取Student所有属性方法并调用 { if (item.Name == "Learn") item.Invoke(student,null); if(item.Name=="Play") item.Invoke(student, null); if (item.Name == "SetAge") item.Invoke(student, new object[] { 28}); } Console.WriteLine("修改后的Age="+type.GetProperty("Age").GetValue(student)); Console.ReadKey(); } }
输出结果:
转载于:https://blog.51cto.com/ccandzy/1973669