反射这个高大上的词汇常常听说,很少用到,最近有个项目刚好接触到,顺别记录下用法。
1、已知类的调用
既然是已知类了,为什么还用反射呢,因为这涉及到工厂模式,比如用数据库的文本来调用已知的类里的方法,只要从数据库里获取到方法名以及参数,就可以通过以下方法,直接使用,程序单步的时候,就会发现带入的参数会被执行到所涉及的类里的方法里去。
/// <summary>
/// 动态调用类中的方法、传入参数,并获得返回值
/// </summary>
/// <param name="para"></param>
/// <returns></returns>
private string getMethod(int para)
{
Type t = typeof(funcCls);//类名
MethodInfo mt = t.GetMethod("add");//加载方法名
string DoRet = mt.Invoke(this, new object[] { para }).ToString();//执行返回结果 }
return DoRet;
}
2、未知dll的使用
已知dll的使用是比较常见的,只要引入之后,基本上都比较顺利。但是未知的dll就算复制到debug下,就不知道该做什么了,接下来是显示所有的dll属性方法和字段,当然因为是完整输出,所以会带有其父类的方法。其中有个疑问,导出的方法如何知道其使用方法,比如有几个参数,返回什么数据类型等,希望有人能回答。
/// <summary>
/// 显示出所有的类以及属性方法字段
/// </summary>
public void loadDll()
{
String path = Environment.CurrentDirectory + "\\UcanDotNET.dll"; // 加载动态链接库实际路径
Assembly assmbly = Assembly.LoadFile(path);
Type[] types = assmbly.GetTypes();//类的集合
foreach (var classitem in types)//循环输出所有的类以及该类的字段、方法和属性
{
richTextBox1.AppendText("★★★ 类:" + classitem.Name + "\n");
foreach (var fileditem in classitem.GetFields())
{
richTextBox1.AppendText("字段名:" + fileditem.Name+"\n");
}
foreach (var methodItem in classitem.GetMethods())
{
richTextBox1.AppendText("方法名:" + methodItem.Name+"\n");
}
foreach (var properties in classitem.GetProperties())
{
richTextBox1.AppendText("属性名:" + properties.Name + "\n");
}
}