首页 新闻 赞助 找找看

泛型反射工厂如何使用,如何反射创建泛型子对象,如何在泛型工厂中使用反射

0
悬赏园豆:20 [已关闭问题] 关闭于 2015-08-27 11:44

泛型反射工厂如何使用,如何反射创建泛型子对象,如何在泛型工厂中使用反射

 

为了让问题更加明白,我把项目的简化版创建了出来。

/*----------------3、两个类模型------------------*/

namespace W02Factory.MODELS

{

    /// <summary>

    /// 学生表模型。为了明了,只定了两个属性

    /// </summary>

    public class Student

    {

        public string Name { get; set; }

        public string Age { get; set; }

    }

}

namespace W02Factory.MODELS

{

    /// <summary>

    /// 学生成绩表。只定了两个属性

    /// </summary>

    public class StudentScore

    {

        public string mathematics { get; set; }

        public string chemistry { get; set; }

    }

}

/*----------------4、泛型父类------------------*/

namespace W02Factory

{

    /// <summary>

    /// 父类,定义共用的方法,重点:是泛型的。

    /// 为了明了,假设只有Add和list方法

    /// </summary>

    public class BaseTable<T> where T : class,new()

    {

        public int Add()

        {

            return 1;

        }

 

        public List<T> list(T model)

        {

            return null;

        }

    }

}

/*----------------5、两个泛型子类------------------*/

namespace W02Factory

{

    /// <summary>

    /// 子类,操作Student

    /// </summary>

    public class StudentBLL<T>:BaseTable<MODELS.Student> where T:class,new()

    {

    }

}

namespace W02Factory

{

    /// <summary>

    /// 子类,操作StudentScore

    /// </summary>

    public class StudentScoreBLL<T> : BaseTable<MODELS.StudentScore> where T : class,new()

    {

    }

}

/*----------------6、泛型反射工厂------------------*/

namespace W02Factory

{

    /// <summary>

    /// 泛型反射工厂

    /// </summary>

    public class ReflectFactory<T> where T:class,new()

    {

        public static BaseTable<T> CreateTable(string typeName)

        {

            ----怎么写反射?是泛型的。----

//Assembly.LoadFile(@"C:\Users\Lin\Desktop\反射示例4\W01WebUI\bin\W02Factory.dll");

            //Type type = Type.GetType(typeName, true);

            //BaseTable<T> bt = Activator.CreateInstance(type) as BaseTable<T>;

 

            //BaseTable<T> bt = Assembly.LoadFile(@"C:\Users\Lin\Desktop\反射示例4\W01WebUI\bin\W02Factory.dll").CreateInstance(typeName) as BaseTable<T>;

 

            BaseTable<T> bt = Assembly.Load("W02Factory").CreateInstance(typeName) as BaseTable<T>;

            return bt;

        }

    }

}

/*----------------7、控制器------------------*/

public ActionResult Index()

{

    ----在客户端又怎么调用?-----

    BaseTable<Student> student =ReflectFactory<Student>.CreateTable("W02Factory.MODELS.Student");

    ViewBag.student2 = student.Add();

    return View();

}

/*----------------8、视图------------------*/

@ViewBag.student2//我想把Add()返回的1显示出来,以验证成功与否。

 

/*----------------现在的问题是:------------------*/

在“6、泛型反射工厂”这部分,当如何使用反射?,然后在“7、控制器”中如何调用这个工厂?如果是普通的反射倒很容易,但是现在反射的是泛型的。我怎么都搞不定。

 

请大家帮帮忙!

 

我的邮箱:121_9908@163.com

/*----------------项目运行后,出现如下错误:------------------*/

 

“/”应用程序中的服务器错误。

 

未将对象引用设置到对象的实例。

说明:执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
 异常详细信息:System.NullReferenceException: 未将对象引用设置到对象的实例。
源错误:

行 15:         {

行 16:             BaseTable<Student> student =ReflectFactory<Student>.CreateTable("W02Factory.MODELS.Student");

行 17:             ViewBag.student2 = student.Add();

行 18:             return View();

行 19:         }


源文件: c:\Users\Lin\Desktop\反射示例4\W01WebUI\Controllers\HomeController.cs    : 17

啊伟的主页 啊伟 | 初学一级 | 园豆:172
提问于:2013-12-28 13:28
< >
分享
所有回答(2)
0

我没测试过,思路是

你typeof(BaseTable<Student>)看下结果

打断点看下元数据是什么样子,应该就能弄出来了

吴瑞祥 | 园豆:29449 (高人七级) | 2013-12-28 16:56

Type type = typeof (StoreBase<Test>);的结果是

[System.RuntimeType] = {Name = "StoreBase`1" FullName = "JCBJ.WebApi.Models.StoreBase`1[[WebApiTest.StoreTest.StoreBaseTest+Test, WebApiTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"}

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2013-12-28 17:09

查到了,还挺麻烦,你自己看下

http://msdn.microsoft.com/zh-cn/library/b8ytshk6(v=vs.110).aspx

如何:使用反射检查和实例化泛型类型

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2013-12-28 17:31

@吴瑞祥: 谢谢你的解答。。

我试下。

支持(0) 反对(0) 啊伟 | 园豆:172 (初学一级) | 2014-01-07 11:39
0

看起来挺高深的啊

jerry-Tom | 园豆:4077 (老鸟四级) | 2013-12-30 16:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册