反射這個高大上的詞彙常常聽說,很少用到,最近有個項目剛好接觸到,順別記錄下用法。
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");
}
}