C#是面相对象编程语言,跟JAVA一样,所以我们在做项目的时候,也可以针对java的设计方式来进行程序设计,我们在程序设计的时候有时候希望动态的创建对象及调用对象的方法及属性,说以我们今天来讲讲反射。
我们在程序设计的时候,主要就是对象间的相互调用,调用的是什么-------方法,为什么呢?因为一个对象分成两个部分,属性和行为,行为就是方法,我们程序就是需要他来做一些事情,所以需要去调用方法。
在JAVA中我们的反射核心类是Class,而在c#中,反射的核心类是Type,其实原理是一样的。下面我们通过代码来讲解实际开发的使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectDemo
{
class Pro1
{
public string username { set; get; }
public string address { set; get; }
public void setValueInfo(string aa) {
username = aa;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace ProjectDemo
{
class Program
{
static void Main(string[] args)
{
Pro1 aa = new Pro1();
aa.address = "diyu";
aa.username="sishen";
//根据全限定性类名获取类型对象
Type _type = Type.GetType("ProjectDemo.Pro1");
//反射动态创建对象
Pro1 bb = Activator.CreateInstance(_type) as Pro1;
//反射根据名称获取属性信息
PropertyInfo _info= _type.GetProperty("username");
PropertyInfo _add = _type.GetProperty("address");
//反射根据方法名获取方法信息
MethodInfo _method=_type.GetMethod("setValueInfo");
//反射获取方法的参数信息,我们传递参数主要是关注参数名称,参数类型,参数个数
ParameterInfo[] _para=_method.GetParameters();
for (int i = 0; i < _para.Length;i++ )
{
System.Console.WriteLine(_para[i].Name + "---" + _para[i].ParameterType);
}
//反射给属性赋值
_add.SetValue(bb,"dsdsds");
//反射调用方法
object[] para=new object[1];
para[0]="sigou";
_method.Invoke(bb, para);
// bb.username = "yanwang";
System.Console.WriteLine(_info.GetValue(aa));
System.Console.WriteLine(bb.username);
System.Console.WriteLine(bb.address);
}
}
}