假設1我有個類叫SortClass,類中有個BubbleSort(int[] array)用於給數組進行排序。
假設2我有個類叫SortT<T>,類中有個BubbleSort(T[] array)用於給數組進行排序。
現在我需要在控制台應用程序里通過反射調用BubbleSort方法為數組int[] array進行排序。
int[] array = new int[] { 1,7,98,165,4,8,97 };
假設1中由於類和方法不是泛型,實現起來比較簡單,我就不多說了。具體代碼如下:
需要反射的類的代碼:
public class SortClass
{ //一個簡單的冒泡排序
public void BubbleSort(int[] array)
{ int temp;
for (int i = 0; i < array.Length - 1;i++ )
{
for (int j = i + 1; j < array.Length; j++)
{
if (array[j] > array[i])
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
}
控制台中代碼如下:
Assembly assembly = Assembly.LoadFrom(@"C:\Documents and Settings\lh\桌面\反射例子\反射\Exception_01_反射\bin\Debug\SortClasses.dll");
Console.WriteLine(assembly.FullName);
Object oo = assembly.CreateInstance( "SortClasses.SortClass" ); //得到對象SortClasses為命名空間名
MethodInfo methodinfo = assembly.GetType( "SortClasses.SortClass").GetMethod( "BubbleSort" ); //得到方法
Object obj = methodinfo.Invoke(oo, new object[] { array }); //調用方法,給參數,得到結果
for (int i = 0; i < arrty.Length; i++)
{
Console.WriteLine(arrty[i]);
}
假設2 需要反射的是一個泛型,百度谷歌了很久才找到我想要的答案。有些代碼我也還很不理解。唉,還得繼續研究理解下。
需要反射的類的代碼:
public class SortT<T>where T:IComparable
{
public void BubbleSort(T[] array)
{
T temp;
for (int i = 0; i < array.Length - 1; i++)
{
for (int j = i + 1; j < array.Length; j++)
{
if (array[j].CompareTo(array[i])>0)
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
}
控制台中代碼如下:
Assembly assembly = Assembly.LoadFrom( @"F:\HomeWork\C#\反射例子\反射\SortClasses\bin\Debug\SortClasses.dll" );
Console.WriteLine(assembly.FullName);
Type type = assembly.GetType( "SortClasses.SortT`1" ); //得到此類類型 注:(`1) 為占位符 不明確類型
Type t = type.MakeGenericType(typeof(int)); //指定泛型類
object obj = assembly.CreateInstance(t.FullName); //創建其實例
MethodInfo mi = t.GetMethod( "BubbleSort" ); //調用方法
object [] argss = { array }; //參數
object returnValue = mi.Invoke(obj, argss); // 觸發此方法
for (int i = 0; i < array.Length; i++)
{
Console.WriteLine(array[i]);
}
假設2中出自博客園中http://m.cnblogs.com/67560/1683466.html的代碼
其它參考資料:http://msdn.microsoft.com/zh-cn/library/ms173128(VS.80).aspx