如何将反射获得的类型看成泛型中的参数类型进行传递

一、问题的出现测试

// 这个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

相关文章
相关标签/搜索