C#中反射泛型 CreateInstance


假設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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM