直接使用反射的机会比较少,一次自己做的WinForms小工具的时候利用反射来动态获取窗体上的每个控件,并且为必要的控件动态添加注册事件。因为刚入职新公司,为了更快的了解公司的业务、和开发习惯,先和现在公司同事一起修改现有系统的一些小Bug。
在Tester提交的Bug中有一个是对GridView进行动态的排序——点击一个列时使用该列作为条件进行排序(PS:点击一个列时前台会将该列的字符串(该字符串是)传到后台的方法中)。
classProgram
{
staticvoidMain(string[]args)
{
Typetype=typeof(Employee);
//使用无参
构造函数动态创建对象
varobjNull=type.InvokeMember(null,BindingFlags.CreateInstance,null,null,null);
//调用两个使用了两个string参数的构造函数动态创建对象
varfrankJob=type.InvokeMember(null,BindingFlags.CreateInstance,null,null,newobject[]{"job","frank"});
//调用公有成员属性get方法
varfileName=type.InvokeMember("FirstName",BindingFlags.GetProperty,null,frankJob,null);
//调用公有成员属性set方法
type.InvokeMember("Email",BindingFlags.SetProperty,null,frankJob,newobject[]{"test@jb200.com"});
//动态调用无参数方法
varobjStr=type.InvokeMember("ToString",BindingFlags.InvokeMethod|BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static,null,frankJob,null);
//动态调用带参数的方法
varemail=type.InvokeMember("GetEmail",BindingFlags.InvokeMethod,null,frankJob,newobject[]{"sunshine"});
}
publicclassEmployee
{
publicintId{get;set;}
publicstringFirstName{get;set;}
publicstringLastName{get;set;}
publicstringAddress{get;set;}
publicstringEmail{get;set;}
publicEmployee(){}
publicEmployee(stringfirstName,stringlastName)
{
FirstName=firstName;
LastName=lastName;
}
publicoverridestringToString()
{
returnstring.Format("{0}{1}",LastName,FirstName);
}
publicstringGetEmail(stringuser)
{
returnstring.Format("{0}@gmail.com",user);
}
}
}