C# 泛型动态传类型问题

CodeFriends 2017-09-01 10:02:38
string classfullname = "xxxxxxxxxxxxxx";
Type type = Type.GetType(classfullname);
//DisplayForm displayFormImp =type.Assembly.CreateInstance(classfullname) as DisplayForm;

//where T :DisplayForm 如何动态传入类型T呢,类名指向classfullname
dynamic t = new DisplayTempFormManager<T>();

DisplayForm frm = t.GetInstance(ui.LevelCode);

dtuIdForm.Add(ui.LevelCode, frm);
...全文
586 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
同样道理,代码
DisplayForm displayFormImp =type.Assembly.CreateInstance(classfullname) as DisplayForm;   
你这里也忘记了接口编程基本原则了!软件的所谓“工程思想”就在于接口是在其它各种低级的 class 之前——可能早几年前——就定义好的,然后后边的几行代码按照接口编程,实行多态机制。 一旦有了什么 dynamic 机制之类的,不是让人滥用反射的。一定要善用软件工程,避免滥用动态特征。
  • 打赏
  • 举报
回复
反射有着严重的某些问题,所通常要尽量限制反射。一个大系统仅在最高层的插件机制中才稍微用一下反射。 在使用反射时,当然是要避免滥用反射的。所以反射的结果要按照接口编程,也就是
dtuIdForm.Add(a, b)
这里的参数应该定义为某种预先定义好的接口,而不是动态类型。那么代码就会写为
dtuIdForm.Add(ui.LevelCode, (接口类型)frm);
而已。
  • 打赏
  • 举报
回复
你可能误会了泛型概念。 泛型的参数不是动态参数的概念,而是一个静态编译常量。也就是说,在编译时就应该能静态得到T的结果,而不是动态传参的!
CodeFriends 2017-09-01
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
你可能误会了泛型概念。 泛型的参数不是动态参数的概念,而是一个静态编译常量。也就是说,在编译时就应该能静态得到T的结果,而不是动态传参的!
只是很疑惑这个地方能不能实现,还是基础不扎实的问题
CodeFriends 2017-09-01
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
反射有着严重的某些问题,所通常要尽量限制反射。一个大系统仅在最高层的插件机制中才稍微用一下反射。 在使用反射时,当然是要避免滥用反射的。所以反射的结果要按照接口编程,也就是
dtuIdForm.Add(a, b)
这里的参数应该定义为某种预先定义好的接口,而不是动态类型。那么代码就会写为
dtuIdForm.Add(ui.LevelCode, (接口类型)frm);
而已。
怎么说呢,业务逻辑被我设计得可能有点绕,父类displayform下面有许多displayActionXXXform,另一方面displayImpXXXFormManager要对不同的displayActionXXXform进行实例的管理,然后我发现displayImpXXXFormmanager里面的实现都差不多,所以就用泛型整合一下他们,不用泛型的话,功能其实已经走通了。但是不用泛型的话,后续扩展displayActionXXXform就要继续写对应的displayImpXXXFormmanager类。现在是觉得我整个逻辑设计有问题,在简化。 dynamic是因为感觉这个地方,可能在约束的时候编译通不过,所以给了这个关键字。 一直久仰大神,感谢您在csdn里为.net做出的贡献

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧