泛型反射工厂如何使用,如何反射创建泛型子对象,如何在泛型工厂中使用反射
为了让问题更加明白,我把项目的简化版创建了出来。
/*----------------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
我没测试过,思路是
你typeof(BaseTable<Student>)看下结果
打断点看下元数据是什么样子,应该就能弄出来了
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]]"}
@吴瑞祥: 谢谢你的解答。。
我试下。
看起来挺高深的啊