反射的另类实现。(不知道这么用还算不算反射了?)


在asp.net里面实现反射除了用
Assembly.Load("SMS").CreateInstance("SMS.短信" + 短信开头的编号) 
之外还有没有其它的方法呢?

.net里面有UserControl ,而UserControl 又可以使用 Page.LoadControl("UC_Show1.ascx") 的方式来加载。当然 UserControl 也是可以继承的。

Page.LoadControl 的参数是字符串,那么就可以动态设置了。

于是“反射”也就实现了。

我们先定义一个基类:UC_Base
反射的另类实现。(不知道这么用还算不算反射了?)public class UC_Base: System.Web.UI.UserControl
反射的另类实现。(不知道这么用还算不算反射了?)反射的另类实现。(不知道这么用还算不算反射了?)    
反射的另类实现。(不知道这么用还算不算反射了?){
反射的另类实现。(不知道这么用还算不算反射了?)        
private string strCusID = "";
反射的另类实现。(不知道这么用还算不算反射了?)        
反射的另类实现。(不知道这么用还算不算反射了?)反射的另类实现。(不知道这么用还算不算反射了?)        
/**//// <summary>
反射的另类实现。(不知道这么用还算不算反射了?)        
/// 客户ID
反射的另类实现。(不知道这么用还算不算反射了?)        
/// </summary>

反射的另类实现。(不知道这么用还算不算反射了?)        public string CusID
反射的另类实现。(不知道这么用还算不算反射了?)反射的另类实现。(不知道这么用还算不算反射了?)        
反射的另类实现。(不知道这么用还算不算反射了?){
反射的另类实现。(不知道这么用还算不算反射了?)反射的另类实现。(不知道这么用还算不算反射了?)            
get反射的另类实现。(不知道这么用还算不算反射了?){return strCusID;}
反射的另类实现。(不知道这么用还算不算反射了?)反射的另类实现。(不知道这么用还算不算反射了?)            
set反射的另类实现。(不知道这么用还算不算反射了?){strCusID = value;}
反射的另类实现。(不知道这么用还算不算反射了?)        }

反射的另类实现。(不知道这么用还算不算反射了?)
反射的另类实现。(不知道这么用还算不算反射了?)反射的另类实现。(不知道这么用还算不算反射了?)        
/**//// <summary>
反射的另类实现。(不知道这么用还算不算反射了?)        
/// 显示数据
反射的另类实现。(不知道这么用还算不算反射了?)        
/// </summary>
反射的另类实现。(不知道这么用还算不算反射了?)        
/// <returns></returns>

反射的另类实现。(不知道这么用还算不算反射了?)        public virtual bool ShowData()
反射的另类实现。(不知道这么用还算不算反射了?)反射的另类实现。(不知道这么用还算不算反射了?)        
反射的另类实现。(不知道这么用还算不算反射了?){
反射的另类实现。(不知道这么用还算不算反射了?)            
return true;
反射的另类实现。(不知道这么用还算不算反射了?)        }

反射的另类实现。(不知道这么用还算不算反射了?)


然后建立UserControl 若干,让这些UserControl都继承 UC_Base
反射的另类实现。(不知道这么用还算不算反射了?)public class UC_Show1 : UC_Base
反射的另类实现。(不知道这么用还算不算反射了?)反射的另类实现。(不知道这么用还算不算反射了?)    
反射的另类实现。(不知道这么用还算不算反射了?){
反射的另类实现。(不知道这么用还算不算反射了?)        
public override bool ShowData()
反射的另类实现。(不知道这么用还算不算反射了?)反射的另类实现。(不知道这么用还算不算反射了?)        
反射的另类实现。(不知道这么用还算不算反射了?){
反射的另类实现。(不知道这么用还算不算反射了?)            Response.Write(
"我是子类一,我要显示数据了");
反射的另类实现。(不知道这么用还算不算反射了?)            
return true;
反射的另类实现。(不知道这么用还算不算反射了?)        }

反射的另类实现。(不知道这么用还算不算反射了?)
反射的另类实现。(不知道这么用还算不算反射了?)}


最后在建立一个 asp.net页面,里面放一个 PlaceHolder 控件,然后在Page_Load 写如下几行就ok了。
反射的另类实现。(不知道这么用还算不算反射了?)HBS.UCTest.UC_Base ucBase = (UC_Base)Page.LoadControl("UC_Show1.ascx");
反射的另类实现。(不知道这么用还算不算反射了?)
反射的另类实现。(不知道这么用还算不算反射了?)            PH.Controls.Add(ucBase);
反射的另类实现。(不知道这么用还算不算反射了?)
反射的另类实现。(不知道这么用还算不算反射了?)            ucBase.CusID 
= "11";
反射的另类实现。(不知道这么用还算不算反射了?)            ucBase.ShowData();


使用这种方法有两个优点:

1、不仅可以加载算法,还可以加载控件。
2、可以让表单更灵活的组合,更容易的实现控件级别的复用。
3、可以实现不用编译就可以修改程序。可以利用“代码前置”的功能,把 ShowData() 的实现的代码写在 .ascx文件里面,这样修改之后不用编译就可以看到修改后的效果了。在一些特殊的情况下会用到。


好像大家总是想把控件和算法分离开来,但是在有些时候合在一起考虑也许会更方便。

或则即使分离出来,控件是不是也可以“享受”算法的待遇呢?

至于效率嘛,还没有测试。


最近写一个项目,要在一个表单里处理好几个表,加起来有几十个字段了,所以就用了UserControl来才分,然后在动态的加载,把代码分散在各个 UserControl 里面,一个页面里的代码少了很多,也就便于阅读和修改维护,每一个UserControl 的模式也基本相同。

同时呢如果多个页面用到了相同的表单(或者是一部分),那么就可以用 UserControl 来达到复用的效果。



上一篇:区块链网络技术基础学习笔记


下一篇:Android应用开发提高系列(3)——《Effective Java 中文版》读书笔记