一、问题的出现测试
// 这个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(); } }
二、方法一ui
经过Type类的Type.MakeGenericType方法获取,详细用法请参照MSDN,MSDN上的demo不是很明白,我下面的三行是CSDN上的大牛推荐的。this
// 这个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);
三、方法二code
在此特别感谢个人同窗朱百青帮我写的demo。get
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; } }
四、上述两种方法的对比string
请你们留言写下本身的想法,我模糊的想法是,一种是运行时的,一种是编译时的。it
五、福利io