C# 泛型动态传类型问题

时间:2022-08-30 20:22:24
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);

5 个解决方案

#1


你可能误会了泛型概念。

泛型的参数不是动态参数的概念,而是一个静态编译常量。也就是说,在编译时就应该能静态得到T的结果,而不是动态传参的!

#2


反射有着严重的某些问题,所通常要尽量限制反射。一个大系统仅在最高层的插件机制中才稍微用一下反射。

在使用反射时,当然是要避免滥用反射的。所以反射的结果要按照接口编程,也就是
dtuIdForm.Add(a, b)
这里的参数应该定义为某种预先定义好的接口,而不是动态类型。那么代码就会写为
dtuIdForm.Add(ui.LevelCode, (接口类型)frm);
而已。

#3


同样道理,代码 
DisplayForm displayFormImp =type.Assembly.CreateInstance(classfullname) as DisplayForm;   
你这里也忘记了接口编程基本原则了!软件的所谓“工程思想”就在于接口是在其它各种低级的 class 之前——可能早几年前——就定义好的,然后后边的几行代码按照接口编程,实行多态机制。

一旦有了什么 dynamic 机制之类的,不是让人滥用反射的。一定要善用软件工程,避免滥用动态特征。

#4


引用 2 楼 sp1234 的回复:
反射有着严重的某些问题,所通常要尽量限制反射。一个大系统仅在最高层的插件机制中才稍微用一下反射。

在使用反射时,当然是要避免滥用反射的。所以反射的结果要按照接口编程,也就是
dtuIdForm.Add(a, b)
这里的参数应该定义为某种预先定义好的接口,而不是动态类型。那么代码就会写为
dtuIdForm.Add(ui.LevelCode, (接口类型)frm);
而已。


怎么说呢,业务逻辑被我设计得可能有点绕,父类displayform下面有许多displayActionXXXform,另一方面displayImpXXXFormManager要对不同的displayActionXXXform进行实例的管理,然后我发现displayImpXXXFormmanager里面的实现都差不多,所以就用泛型整合一下他们,不用泛型的话,功能其实已经走通了。但是不用泛型的话,后续扩展displayActionXXXform就要继续写对应的displayImpXXXFormmanager类。现在是觉得我整个逻辑设计有问题,在简化。 dynamic是因为感觉这个地方,可能在约束的时候编译通不过,所以给了这个关键字。

一直久仰大神,感谢您在csdn里为.net做出的贡献

#5


引用 1 楼 sp1234 的回复:
你可能误会了泛型概念。

泛型的参数不是动态参数的概念,而是一个静态编译常量。也就是说,在编译时就应该能静态得到T的结果,而不是动态传参的!


只是很疑惑这个地方能不能实现,还是基础不扎实的问题

#1


你可能误会了泛型概念。

泛型的参数不是动态参数的概念,而是一个静态编译常量。也就是说,在编译时就应该能静态得到T的结果,而不是动态传参的!

#2


反射有着严重的某些问题,所通常要尽量限制反射。一个大系统仅在最高层的插件机制中才稍微用一下反射。

在使用反射时,当然是要避免滥用反射的。所以反射的结果要按照接口编程,也就是
dtuIdForm.Add(a, b)
这里的参数应该定义为某种预先定义好的接口,而不是动态类型。那么代码就会写为
dtuIdForm.Add(ui.LevelCode, (接口类型)frm);
而已。

#3


同样道理,代码 
DisplayForm displayFormImp =type.Assembly.CreateInstance(classfullname) as DisplayForm;   
你这里也忘记了接口编程基本原则了!软件的所谓“工程思想”就在于接口是在其它各种低级的 class 之前——可能早几年前——就定义好的,然后后边的几行代码按照接口编程,实行多态机制。

一旦有了什么 dynamic 机制之类的,不是让人滥用反射的。一定要善用软件工程,避免滥用动态特征。

#4


引用 2 楼 sp1234 的回复:
反射有着严重的某些问题,所通常要尽量限制反射。一个大系统仅在最高层的插件机制中才稍微用一下反射。

在使用反射时,当然是要避免滥用反射的。所以反射的结果要按照接口编程,也就是
dtuIdForm.Add(a, b)
这里的参数应该定义为某种预先定义好的接口,而不是动态类型。那么代码就会写为
dtuIdForm.Add(ui.LevelCode, (接口类型)frm);
而已。


怎么说呢,业务逻辑被我设计得可能有点绕,父类displayform下面有许多displayActionXXXform,另一方面displayImpXXXFormManager要对不同的displayActionXXXform进行实例的管理,然后我发现displayImpXXXFormmanager里面的实现都差不多,所以就用泛型整合一下他们,不用泛型的话,功能其实已经走通了。但是不用泛型的话,后续扩展displayActionXXXform就要继续写对应的displayImpXXXFormmanager类。现在是觉得我整个逻辑设计有问题,在简化。 dynamic是因为感觉这个地方,可能在约束的时候编译通不过,所以给了这个关键字。

一直久仰大神,感谢您在csdn里为.net做出的贡献

#5


引用 1 楼 sp1234 的回复:
你可能误会了泛型概念。

泛型的参数不是动态参数的概念,而是一个静态编译常量。也就是说,在编译时就应该能静态得到T的结果,而不是动态传参的!


只是很疑惑这个地方能不能实现,还是基础不扎实的问题