Пример #1
0
        public void TestGenericParameter()
        {
            IDictionary <List <int>, List <string> > dico = new Dictionary <List <int>, List <string> >();

            Console.WriteLine(typeof(IDictionary <,>).FullName);
            Console.WriteLine(dico.GetType().FullName);

            string assemblyQualifiedName = dico.GetType().AssemblyQualifiedName;
            Type   type = TypeUtils.ResolveType(assemblyQualifiedName);

            Assert.IsNotNull(type);

            MyGeneric <Dictionary <List <int>, List <string> >, string, List <int>, decimal> gen = new MyGeneric <Dictionary <List <int>, List <string> >, string, List <int>, decimal>();

            Console.WriteLine(gen.GetType().FullName);

            assemblyQualifiedName = gen.GetType().AssemblyQualifiedName;
            type = TypeUtils.ResolveType(assemblyQualifiedName);

            Assert.IsNotNull(type);

            Assert.That(gen, Is.InstanceOfType(type));
        }
        /// <summary>
        /// 反射调用泛型类
        /// </summary>
        public void TestGenericType()
        {
            #region 此时不对
            Assembly assembly = Assembly.LoadFrom("NineskyStudy.Base.dll");
            Type     type     = assembly.GetType("NineskyStudy.Base.MyGeneric`1"); //得到此类类型 注:(`1) 为占位符 不明确类型
            //在获取类型时,直接定义泛型类T,则下面调用方法中直接调用,不用设置类型T
            type = type.MakeGenericType(typeof(string));                           //指定泛型类
            object     obj = assembly.CreateInstance(type.FullName);               //Assembly.CreateInstance创建实例
            MethodInfo mi  = type.GetMethod("GetName");

            //调用泛型方法1
            string returnValue = (string)mi.Invoke(obj, new object[] { "123" });
            //调用泛型方法2
            string returnValue2 = (string)type.InvokeMember("GetName", BindingFlags.InvokeMethod, null, obj, new object[] { "123" });

            //检测是否是泛型 type.IsGenericType
            MyGeneric <System.String> genericObj = (MyGeneric <System.String>)Activator.CreateInstance(type);
            ////生成泛型方法
            MethodInfo m = genericObj.GetType().GetMethod("GetName");//.MakeGenericMethod(new Type[] { typeof(System.String) });
            ////调用泛型方法
            var value = m.Invoke(genericObj, new object[] { "a" });

            //获取类型
            Assembly assembly00 = Assembly.LoadFrom("NineskyStudy.Base.dll");
            Type     type00     = assembly00.GetType("NineskyStudy.Base.MyGeneric`1").MakeGenericType(typeof(string));
            Object   obj00      = assembly00.CreateInstance(type00.FullName);

            //当调用方法上又定义新的T1 需要设置新T1为具体类型 但InvokeMember没有找到(现在有错误)
            //type00.InvokeMember("GetName2", BindingFlags.InvokeMethod, null, obj00, new object[] { "a", "T1" });

            //当调用方法上又定义新的T1 需要设置新T1为具体类型
            MethodInfo m00     = obj00.GetType().GetMethod("GetName2").MakeGenericMethod(new Type[] { typeof(string) });
            string     value00 = (string)m00.Invoke(obj00, new object[] { "a", "T1" });
            #endregion

            //Type type = typeof(MyGeneric<string>);
            //object o = Activator.CreateInstance(type);
            //var result = type.InvokeMember("GetName", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, new object[] { "123" });

            //确定泛型参数类型反射方法
            Type   type1 = typeof(Class1 <int>);
            object o1    = Activator.CreateInstance(type1);
            type1.InvokeMember("Test", BindingFlags.Default | BindingFlags.InvokeMethod, null, o1, new object[] { 123 });

            //未确定泛型参数类型反射方法
            Type   type2 = typeof(Class1 <>).MakeGenericType(new Type[] { typeof(System.String) });
            object o2    = Activator.CreateInstance(type2);
            type2.InvokeMember("Test", BindingFlags.Default | BindingFlags.InvokeMethod, null, o2, new object[] { "123" });
        }