木野狐(Neil Chen)

Speak less, do more.

如何在 CLR 类型上实现 IronPython 语言的动态特性,简单的讲,可以通过 ICustomAttributes 接口来实现。

ICustomAttributes 接口是在 IronPython 引擎中定义的 。其成员是给 CLR 类型附加自定义属性的一些操作,一旦定义了这些附加的属性,IronPython 的脚本就通过引擎来访问它们。需要注意的是,这里所谓的属性是 Python 概念中的 attribute,它可以是 Python 函数,类,变量等。

namespace IronPython.Runtime {
    
public interface ICustomAttributes {
        
void DeleteAttr(ICallerContext context, SymbolId name);
        IDictionary
<objectobject> GetAttrDict(ICallerContext context);
        List GetAttrNames(ICallerContext context);
        
void SetAttr(ICallerContext context, SymbolId name, object value);
        
bool TryGetAttr(ICallerContext context, SymbolId name, out object value);
    }
}

在 IronPython for ASP.NET 中定义了三个类:ScriptUserControl, ScriptPage, ScriptMaster. 分别用于页面、用户控件、和母版页。研究了它们的实现后,我画了下面一张图描述其实现情况:

ipy_aspnet_3.jpg

首先,这几个类分别继承自 ASP.NET 中原先的基类。即 System.Web.UI 名称空间下的 Page, UserControl 以及 MasterPage. 在继承了基类特性的同时,它们都实现了 ICustomAttributes 接口。

而在这几个类的内部,ICustomAttributes 接口是通过其成员 ScriptTemplateControl 来实现的,这里是一个桥接模式(Bridge Pattern)。因此,ScriptTemplateControl 才是真正的实现者,在 ScriptTemplateControl 中,实现了自动读取、分析页面相关的后台代码或内联代码,并关联相关的事件处理函数(Event Handlers),以及调用一般函数和数据绑定函数等许多重要的功能,在后续的文章中我会详细来分析其中的一些实现。



posted on 2006-12-10 16:25 木野狐(Neil Chen) 阅读(2011) 评论(16)  编辑 收藏 所属分类: .NET 综合IronPython

Feedback

#1楼 [楼主] 2006-12-10 16:32 木野狐      
原来我用的 'Book' 这个皮肤,导航在右边,发的图大一点就撑的没法看了。
没办法,为了发这篇文章竟然要调一下皮肤设置。

  回复  引用  查看    

#2楼  2006-12-10 17:54 wb [未注册用户]
收藏!
  回复  引用    

#3楼  2006-12-10 18:42 维生素C.NET      
关注狐哥的这个系列
  回复  引用  查看    

#4楼 [楼主] 2006-12-10 19:00 木野狐      
@wb
@维生素C.NET

谢谢!
  回复  引用  查看    

#5楼  2006-12-11 02:01 Jeffrey Zhao      
很巧妙的实现阿!

谢谢你的分析!:)
  回复  引用  查看    

#6楼 [楼主] 2006-12-11 02:27 木野狐      
@Jeffrey Zhao
IronPython 中还有很多巧妙的实现,呵呵,现在感觉精力太少了。好不容易抽时间写了这么一点。
  回复  引用  查看    

#7楼  2006-12-11 09:46 FantasySoft      
速度真快啊! 再次感谢木野狐为大家带来精彩的文章。 :)
  回复  引用  查看    

#8楼 [楼主] 2006-12-11 10:05 木野狐      
@FantasySoft
谢谢支持,因为时间很少,这篇文章写的太简单了点,见谅。
  回复  引用  查看    

#9楼  2006-12-11 16:54 580k [未注册用户]
使用580k.com帮您关注此blog更新
580k是一种WEB形式的网页监控工具(网址:http://***/).所谓网页监控工具,用其首页的描述,就是:您关注的网页内容发生变化时,580k会将变化的内容用邮件通知您.580K作为WEB工具,其提供的功能是有实际应用的,相信一些需要每天关注大量信息的人,如公司老总、炒股者、网络编辑、情报员、论坛灌水爱好者、新闻评论员等,会非常喜欢使用它的.
  回复  引用    

#10楼  2006-12-11 16:59 dell [未注册用户]
好文,辛苦了
  回复  引用    

#11楼 [楼主] 2006-12-11 17:59 木野狐      
@dell
谢谢
  回复  引用  查看    

#12楼  2006-12-12 16:36 非我      
木兄请教个问题:想在Asp.net程序中测试客户端的带宽,不知道该怎么下手,你有这方面的经验吗,能不能给指条路^_^
  回复  引用  查看    

#13楼 [楼主] 2006-12-12 19:22 木野狐      
@非我
呵呵,很抱歉这方面我也没有考虑过。我觉得可以考虑用 javascript 无刷新的方式去读取服务器上一个比较大的资源,在调用前后记下时间点,然后计算。。。
  回复  引用  查看    

#14楼  2006-12-12 22:55 非我      
唉,找了好久都没有找到好的思路……这样做总觉得算出来不准~~
  回复  引用  查看    

#15楼 [楼主] 2006-12-13 01:23 木野狐      
hehe
  回复  引用  查看    

#16楼  2007-02-22 12:14 JesseZhao      
期待
  回复  引用  查看