zoukankan      html  css  js  c++  java
  • 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 Settingslh桌面反射例子反射Exception_01_反射inDebugSortClasses.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:HomeWorkC#反射例子反射SortClassesinDebugSortClasses.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

  • 相关阅读:
    缠中说禅 摘选
    laravel中不使用 remember_token时退出报错,如何解决?
    关于Ubuntu拒绝root用户ssh远程登录
    laravel中类似于thinkPHP中trace功能
    js原生语法实现表格操作
    使用clear来清除localStorage保存对象的全部数据
    JS设置CSS样式的集中方式
    thinkphp两表联查并且分页
    生于忧患,死于安乐 (先秦:孟子及其弟子)
    在对年轻人最不友好的环境中,刘裕起于阡陌,成就霸业
  • 原文地址:https://www.cnblogs.com/fer-team/p/5066638.html
Copyright © 2011-2022 走看看