首页 > 语言 > 关键词  > 控件最新资讯  > 正文

Attribute应用:简化ANF自定义控件初始化过程

2009-02-06 15:52 · 稿源:51CTO.com

Attribute应用,简化ANF自定义控件初始化过程

研究ANF的源码,让我获益良多。其中很多思想,都是非常值得学习的。其中换肤的方式,宝玉已经介绍过了,《Asp.Net Forums2.0深入分析》之 Asp.Net Forums是如何实现代码分离和换皮肤的。不过,当一个自定义控件中服务器端控件比较多的时候,InitializeSkin方法的实现代码就有点烦人了,比如看一下AdminSiteSettings的代码。实在是非常之烦人。模式都一样,如TextBox DisableSiteReason=skin.FindControl("DisableSiteReason") as TextBox之类。所以今天想利用Attribute来简化一下。

首先我们要添加一个Attribute类,暂且就叫做BindControlAttribute:

using System;using System.Collections.Generic;using System.Text;using System.Reflection;namespace AspNetForums.Controls{[AttributeUsage(AttributeTargets.Field|AttributeTargets.Property,AllowMultiple=false)]class BindControlAttribute:Attribute{string _ctrlID;public BindControlAttribute(string ctrlID){_ctrlID = ctrlID;}public string ControlID{get { return _ctrlID; }}}}

这个类Attribute功能比较简单,就是让这个Attribute记录字段要绑定到的控件的ID。

第二步就是修改SkinnedForumWebControl了,主要是添加一个方法:

private void InitializeFields(Control skin){FieldInfo[] fields = this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);foreach (FieldInfo fi in fields){if (fi.IsDefined(typeof(BindControlAttribute), false)){BindControlAttribute bind = fi.GetCustomAttributes(typeof(BindControlAttribute), false)[0] as BindControlAttribute;object ctrl = skin.FindControl(bind.ControlID);fi.SetValue(this, ctrl);}}}

其实在fi.IsDefined(typeof(BindControlAttribute), false)这里我本想再加一个条件的,就是限制字段的类型是System.Web.UI.Control或者它的子类,可是试了几种方法,都没能成功。请知道的指点一下...
记得要引用System.Reflection名称空间,还要改一下CreateChildControls方法的实现:

protected override void CreateChildControls(){Control skin = null;if (inlineSkin != null){inlineSkin.InstantiateIn(this);InitializeSkin(this);}else{// Load the skinskin = LoadSkin();//Initialize the fieldsInitializeFields(skin);//就加这一行// Initialize the skinInitializeSkin(skin);Controls.Add(skin);}}

到这里,实现的任务就完成了。下面就是应用了。应用是比较简单的,只需要在定义字段的时候,加上这个BindControlAttribute就行了。如:

uing System;using System.Collections;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using AspNetForums.Components;using AspNetForums.Enumerations;namespace AspNetForums.Controls{/// /// 论坛组列表服务器控件/// public class ForumGroupView : SkinnedForumWebControl{#region 成员字段private ForumContext forumContext = ForumContext.Current;private string skinFilename = "View-ForumGroupView.ascx";[BindControl("forumGroupRepeater")]//定义字段时加这么一行private Repeater repeater;#endregion public ForumGroupView(){// Assign a default template nameif (SkinFilename == null)SkinFilename = skinFilename;}#endregion #region 控件初始化// *********************************************************************// Initializeskin///// /// Initializes the user control loaded in CreateChildControls. Initialization/// consists of finding well known control names and wiring up any necessary events./// /// // ********************************************************************/ protected override void InitializeSkin(Control skin){//repeater = (Repeater) skin.FindControl("forumGroupRepeater");//这一行就没有用了。DataBind();}

感觉是不是好点呢?

第一次用反射,着实费了我不小的功夫(主要是看书不认真:-))。我要获取私有字段的时候,试了好多次才试出来,后边三年BindingFlags貌似都得加上,少一个都不行。另外,我发现,Attribute构造函数是在调用GetCustomAttributes函数时才调用的。不知道是否有二班的情况呢?

举报

  • 相关推荐
  • 如何通过Matrixport结构化理财产品把握加密市场机遇,稳中求胜?

    文章探讨了在通胀上升、就业下降的宏观环境下,投资者面临的挑战和不确定性。重点介绍了Matrixport提供的加密理财产品,如"趋势智赢"和"鲨鱼鳍"等结构化产品,帮助投资者在不同市场环境下实现稳定收益。特别推出创新产品"海鸥",适合单边行情投资,门槛低、灵活性高,能在极端行情中获取高额收益。Matrixport通过多样化产品矩阵满足不同投资者需求,帮助用户在市场波动中灵活调整策略,实现资金增值。未来将继续深耕加密资管领域,为全球用户提供优质理财服务。

  • Jinfiniti佘金雄与崔圻羽亮相深圳国际大会 解读TAO闭环引领长寿医疗新革命

    2025年深圳国际医疗旅游展会上,精准医疗企业Jinfiniti创始人余金雄教授与亚太区执行官崔园羽女士共同发表主题演讲,介绍其首创的"检测-干预-优化"(TAO)闭环抗衰模式。该企业拥有全球首个商用NAD+检测技术,市场占有率95%,其明星产品Vitality NAD+ Booster在临床中展现出显著效果。余教授深耕抗衰领域40余年,发表400篇同行评审论文,谷歌H指数76。演讲深入解析了通过精准检测、靶向干预和动态优化三步实现科学抗衰的路径,并展望了"健康百岁"的八大TAO支柱。崔女士则分享了亚太本土化实践,计划通过"医疗3.0时代"战略帮助10亿人延长健康寿命10年以上。目前Jinfiniti产品已覆盖60余国,形成全球化服务网络。

  • 维谛Vertiv收购定制化机柜解决方案制造商

    维谛技术(Vertiv)宣布以2亿美元收购美国定制化机柜制造商Great Lakes,以强化其在高密度一体化基础设施解决方案领域的领导地位。此次收购将整合Great Lakes在高端定制化机柜领域的技术优势,帮助维谛为AI数据中心、边缘计算等场景提供更优化的预制化机柜解决方案。交易预计2025年第三季度完成,收购价约为Great Lakes 2026年预期EBITDA的11.5倍。通过整合,维谛将提升端到端基础设施服务能力,应对未来AI技术发展带来的复杂挑战。

  • AI日报:字节将发布AI编程工具TRAE2.0版本;Mistral重磅推出音频模型Voxtral;月之暗面回应Kimi K2 API速度慢

    AI日报栏目聚焦AI领域最新动态:1)字节跳动将发布TRAE 2.0编程工具,新增语音交互功能;2)Mistral推出开源音频模型Voxtral,支持多语言;3)月之暗面回应Kimi K2API速度慢问题,正在优化系统;4)昆仑万维发布AgentOrchestra框架,实现多智能体协作;5)OpenAI前CTO创立的Thinking Machines Lab获20亿美元融资;6)Kimi-2上线,性能超越GPT-4.1;7)TRAE推出Kimi-K2模型服务,国际版支持Grok-4;8)字节跳动Seed�

  • 技嘉科技 STEALTH Revolution 玩转简约装机美学 力邀创作者打造纯白梦幻桌机

    技嘉科技推出STEALTH Revolution活动,主打纯白美学装机概念。活动以X870AORUS STEALTH ICE主板为核心,邀请全球创作者打造个性化桌机。该系列采用背插式设计,简化装机流程,释放机箱空间,便于展示水冷设备和RGB灯效。新品涵盖X870/B850主板、RTX5090显卡及全景机箱等,联合10余家机箱品牌推出20余款兼容产品。活动提供限量主板供参赛者使用,并开放大众投票评选优秀作品,参与者有机会赢取丰厚奖品。技嘉旨在推动"背插主板×纯白机身"的装机新潮流,满足市场对简约风格的需求。

  • 自动化测试首选服务商:Testin云测有何核心优势?

    文章探讨了AI技术如何重构自动化测试体系。传统自动化测试面临维护成本高、跨平台兼容性差等痛点,而AI通过智能用例生成、缺陷预测、自适应测试等能力实现质变:1)NLP技术将需求文档自动转化为可执行测试用例;2)机器学习分析历史数据预测高风险模块;3)计算机视觉实现跨平台UI元素识别。Testin云测构建了覆盖设备层到场景层的完整测试生态,通过云原生架构支持2000+终端实时调度,结合AI中台实现测试效率提升1.5倍,助力某金融机构降低年度质量成本超千万元。AI与自动化测试的深度融合,正推动质量保障体系向智能化、集约化演进。

  • iTAP完成“大考”,这些应用场景将率先落地!

    2025年7月11日,首届iTAP测试大会在西安成功举办。华为、支付宝、华大电子等产业链头部企业共同完成了支付、门禁、票务三大场景下的协议互通性验证,标志着iTAP技术正式通过商用化验证。华为Pura80手机和Watch GT5智能手表成为首批通过全部测试的设备。测试结果显示,iTAP技术突破传统NFC协议痛点,交互效率提升300%,支持存量设备通过软件升级接入,显著降低硬件迭代成本。产业协同效应显现,多家芯片厂商已制定明确技术路线图,加速生态布局。未来iTAP技术将在智慧交通、数字生活等领域加速商业化落地,ITMA协会拟于2025年第四季度再次举办测试大会,持续推动产业协同发展。

  • A日报:Stability AI发布实时重建模型SPAR3D;火山引擎“奇美拉”数字人平台启动封测;京东重磅开源JoyAgent-JDGenie

    AI日报栏目精选了人工智能领域最新动态:1)Stability AI推出0.7秒单图3D重建模型SPAR3D;2)GitHub热门开源AI协作框架CrewAI获3.4万星;3)马斯克发布儿童AI聊天机器人Baby Grok引发安全争议;4)ComfyUI-C opilot工具简化AI工作流创建;5)CNNIC报告显示我国346款生成式AI完成备案;6)提示词管理工具AI Gist上线;7)开源语言学习工具WordPecker支持多语言学习;8)斯坦福推出多工具协作AI Agent OctoTools;9)Ope

  • 玩聚点TR技术引爆线下社交,碰一碰解锁真人大富翁!

    上海商场出现新型社交娱乐方式"玩聚点"(POLYPLAY),通过智能手环触碰商场内的能量方块进行互动游戏。用户可组队竞技、收集积分兑换优惠券,92%测试用户给出4.5分以上好评。该模式融合TR技术(Touch+Reality),将线上游戏乐趣具象化到现实场景,18-35岁年轻用户占60%,家庭用户占30%,既能满足Z世代社交需求,又成为亲子互动新选择。项目将于8月1-4日登陆ChinaJoy展会,现场可通过NFC技术解锁限定徽章和周边奖品。

  • 2025年一体化ERP TOP10:以专业实力赋能企业生态

    文章介绍了2025年十大一体化ERP厂商排名,分析了各厂商在数字化时代的优势与特点。智邦国际作为一体化管理倡导者,提供全流程解决方案;鼎捷智能专注智能制造与数字化转型;用友网络作为老牌劲旅,提供全面企业管理方案;金蝶国际在云ERP领域优势显著;浪潮集团服务大型企业,系统稳定性强;SAP中国作为全球领先厂商,集成能力突出;Oracle中国依托数据库技术优势;Infor在垂直行业深耕;Sage提供精简高效方案;Microsoft Dynamics 365以灵活性著称。文章建议企业根据规模、行业特点和预算选择适合的ERP系统,推动数字化转型。