如何将反射得到的类型当作泛型中的参数类型进行传递

1、问题的出现

// 这个tableName是从报文里读取的,现在测试,我直接给个名字
 string tableName = "BaoHuGuiHua";

// 反射获取表名的Type 
Type type = Assembly.Load("Apt.MWSGR.Domain").GetType("Apt.MWSGR.Domain.Entities." + tableName);


// 问题就在这,怎么把BaoHuGuiHua这个实体传到下面的泛型里面去,就是大T那点我应该怎么写?
var exportDataByTableNameQuery = new ExportDataByTableNameQuery<T>();

// 调用方法,获取全部数据
var exportData = exportDataByTableNameQuery.GetAll();

public class ExportDataByTableNameQuery<T>:NHibernateQuery where T:class
    {
        public IEnumerable<T> GetAll()
        {
            return this.Session.Query<T>().ToList();
        }
    }


2、方法一

        通过Type类的Type.MakeGenericType方法获取,详细用法请参照MSDN,MSDN上的demo不是很明白,我下面的三行是CSDN上的大牛推荐的。

 // 这个tableName是从报文里读取的,现在测试,我直接给个名字
string tableName = "BaoHuGuiHua";

// 反射获取表名的Type 
Type type = Assembly.Load("Apt.MWSGR.Domain").GetType("Apt.MWSGR.Domain.Entities." + tableName);

type = typeof(ExportDataByTableNameQuery<>).MakeGenericType(type);
object exportDataByTableNameQuery = Activator.CreateInstance(type);
// 下面这句话是关键,太长了,分3行显示
var  exportData = type.GetMethod("GetAll", System.Reflection.BindingFlags.Public | 
System.Reflection.BindingFlags.Instance, null, new Type[0], null)
.Invoke(exportDataByTableNameQuery, null);


3、方法二

        在此特别感谢我的同学朱百青帮我写的demo。

static void Main(string[] args)
        {
            //System.Collections.Generic.List`1[ConsoleApplication1.Class1]
            //List<string> list = new List<string>();
            //Console.WriteLine(list.ToString());

            //Test<Class2> t = new Test<Class2>();
            //Console.WriteLine(t.ToString());

            Assembly ass = Assembly.LoadFile(@"C:\Users\cc-zbq\Documents\Visual Studio 2012\
Projects\项目\ConsoleApplication1\ClassLibrary1\bin\Debug\ClassLibrary1.dll");
            object fanXing = ass.CreateInstance("ClassLibrary1.Test`1[ClassLibrary1.Class2]");
            Type t = fanXing.GetType();
            object lei = ass.CreateInstance("ClassLibrary1.Class2");
            Type l = lei.GetType();
            l.GetProperty("Name").SetValue(lei,"小强");
            object result = t.GetMethod("Method1").Invoke(fanXing,new object[]{lei});
            var r = result as IEnumerable;
            var r1 = r.GetEnumerator();
            r1.Reset();
            while (r1.MoveNext())
            {
                Console.WriteLine(r1.Current.GetType().GetProperty("Name").GetValue(r1.Current)
.ToString());
            }
           // Console.WriteLine(result.ToString());
            Console.ReadKey();
        }

public class Test<T> where T: class,new()
    {       
        public List<T> Method1(T t1)
        {
            var r=new List<T>();
            r.Add(t1);
            return r;
        }
    }

 public class Class2
    {
        public string Name { get; set; }
       
    }

4、上述两种方法的对比

        请大家留言写下自己的想法,我模糊的想法是,一种是运行时的,一种是编译时的。



5、福利

如何将反射得到的类型当作泛型中的参数类型进行传递_第1张图片

如何将反射得到的类型当作泛型中的参数类型进行传递_第2张图片

如何将反射得到的类型当作泛型中的参数类型进行传递_第3张图片

如何将反射得到的类型当作泛型中的参数类型进行传递_第4张图片

如何将反射得到的类型当作泛型中的参数类型进行传递_第5张图片

















你可能感兴趣的:(反射,泛型)