`
izuoyan
  • 浏览: 9222212 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

CodeSmith基础(八)

阅读更多

CodeSmith基础(八)

编写CodeSmith自定义属性的编辑器(Writing Custom Property Editors

当你开始编写自定义的CodeSmith模板时,很可能对于使用它的stringsintegers属性很满意,但有时你会发现需要创建一个不同类型的属性,可能是一个自定义的类型或者是.NET framework中但是在属性面板中没有提供的类型。在模板中去作这些很简单,但是怎样指定一个类型在运行模板时显示在属性面板中呢?例如创建了一个Person类并且具有很多不同的属性,但是却没有办法让用户去组装这个类……除非创建一个自定义属性编辑器。

属性面板提供了方法去编写自定义的属性编辑器,当用户在面板上选择一个属性时可以激发相应的方法,同时也可以通过编写代码实现提示用户输入一个必要的值。下面我们举个例子,创建一个接受组建的属性并且是用影射循环贯串所有的类,是所有的类都可以使用它和它的方法,去创建一个NUnit测试基础。(这句翻译的不好,原文:As an example we are going to build a template which accepts an assembly as a property and then using reflection loops through all of the classes, and the methods of those classes, to build NUnit test stubs.

首先,我们来关注一下模板的组件属性,暂且不看自定义编写的代码。模板的第一部分是一些声明定义和属性。将属性放在脚本标签中代替使用属性声明,在下一部分将看到这样做的必要。

1<%@CodeTemplateLanguage="C#"TargetLanguage="C#"Description="Buildsaclassforeachclassintheassembly,andateststubforeverymethod."%>
2
3<%@ImportNameSpace="System.Reflection"%>
4
5<scriptrunat="template">
6
7privateAssemblyassembly;
8
9publicAssemblyAssemblyToLoad
10{
11get{returnassembly;}
12set{assembly=value;}
13}

14
15</script>

然后我们为组建assembly中的每一个类创建一个类,为每一个类创建他的方法。然后直接将模板的输出内容放入Visual Studio.NET,然后在编写组件的单元测试时使用向导。

1usingSystem;
2usingNUnit.Framework;
3
4<%
5foreach(TypeTinAssemblyToLoad.GetTypes())
6{
7if(T.IsClass)
8{
9%>
10
11[TestFixture]
12publicclass<%=T.Name%>Tests
13{
14<%
15MethodInfo[]methods=T.GetMethods(BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static);
16foreach(MethodInfoMinmethods)
17{
18%>
19
20[Test]
21publicvoid<%=M.Name%>Test
22{
23//TODOWritethistest
24}

25<%
26}

27
28%>}
<%
29}

30}

31%>

/Files/Bear-Study-Hard/AssemblyHelper.zip

首先我们需要创建一个继承UITypeEditor的类。

1publicclassAssemblyFilePicker:UITypeEditor
2{
3publicAssemblyFilePicker():base()
4{
5}

6}

关于UITypeEditor的说明请大家参看M<rtx w:st="on">SD</rtx>NVisual Studio.NET自带帮助中的说明,其中有详细的例子。

然后我们需要重载UITypeEditor类的两个不同的方法。第一个需要重载点的方法是GetEditStyle,这个方法是告诉属性面板对于当前类型是用什么类型的编辑器,在这个例子中我们设置编辑类型为Modal。这样大家可以在该属性格子的右边看到一个小按钮,它将引发一个对话框等模式的对话(trigger a modal dialog)。这是我们的GetEditStyle方法:

1publicoverrideUITypeEditorEditStyleGetEditStyle(ITypeDescriptorContextcontext)
2{
3returnUITypeEditorEditStyle.Modal;
4}

其中的Modal为显示一个省略号按钮。

需要重载的另一个方法是EditValue方法,当用户电击属性时会调用这个方法。按照我们需要加载的组件类型需要创建一个打开文件对话框(open file dialog)然后捕获这个对话框,在属性格子中返回对话框的结果。

1publicoverrideobjectEditValue(ITypeDescriptorContextcontext,IServiceProviderprovider,objectvalue)
2{
3
4if(provider!=null)
5{

首先我们要从当前的服务和控件中得到一个参考,有了控件的参考我们可以通过它转到ShowDialog方法。(原文:First we need to get a reference to the current service and control, we need the reference to the control so we can pass it to the ShowDialog method.
1IWindowsFormsEditorServiceeditorService=(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
2ControleditorControl=editorServiceasControl;
3
4if(editorControl!=null)
5{

1OpenFileDialogopenFileDialog=newOpenFileDialog();
2
3openFileDialog.CheckFileExists=true;
4openFileDialog.DefaultExt=".dll";
5openFileDialog.Multiselect=false;
6openFileDialog.Title="SelectanAssembly:";
7openFileDialog.Filter="AssemblyFiles|*.dll";

1DialogResultresult=openFileDialog.ShowDialog(editorControl);

1if(result==DialogResult.OK)
2{
3Assemblyassembly=Assembly.LoadFrom(openFileDialog.FileName);
4value=assembly;
5}

6else
7{
8value=null;
9}

10}
11}
12
13returnvalue;
14}

加载这个模板我们仅需将这个组件assembly与模板放在同一目录下,然后再模板中加入下面两行代码。

1<%@AssemblyName="AssemblyHelper"%>
2<%@ImportNameSpace="AssemblyHelper"%>
然后我们创建一个openFileDialog类并填入适合的属性。 然后我们通过控件的参考(reference)将对话框显示给用户。 下一步我们检查用户是否点击了OK按钮,如果点击了,通过文件选择对话框选择文件后使用LoadForm方法加载这个组件,最后返回这个值。 这个值将被放在属性面板中并可以被模板读取,但是需要注意,在我们作这个之前要将组件import引入到模板中,并在模板中用一对属性声明。

然后我们要在组建属性中添加Editor属性,并且指定为UITypeEditor编辑器。
1[Editor(typeof(AssemblyHelper.AssemblyFilePicker),typeof(System.Drawing.Design.UITypeEditor))]
2publicAssemblyAssemblyToLoad
3{
4get{returnassembly;}
5set{assembly=value;}
6}

当属性面板读取到这些属性时,它将使用我们自定义的UITypeEditor编辑器并允许用户从打开文件对话框中选择一个组件。

这个模板仅仅可以编译通过,但是由于我们编写显示了一个类型属性面板并不知道如何去操作它,所以我们没有办法自定义指定组件在加载时想要加载的组件。

我们需要创建一个UITypeEditor,这是一个建立属性面板是用的特殊属性的类。UITypeEditor需要创建在一个和模板分离的组件中,我们是用Visual Studio创建这个类。

分享到:
评论

相关推荐

    CodeSmith基础与应用

    CodeSmith基础与应用实例(网页资料打包)

    CodeSmith 基础教程 word版

    本文档是一个关于 CodeSmith 的基础教程,针对的是 CodeSmith Professional v5.1.3.8510 版本,以 C# 为例进行说明。 首先,我们需要对 CodeSmith 进行必要的设置,以便它能够正确处理中文字符。在工具的选项中,...

    CodeSmith使用基础教程

    本教程将带你深入理解CodeSmith的基础用法,通过一系列详细的网页教程,帮助你掌握其核心概念和功能。 首先,我们从“CodeSmith使用基础教程 一 — 模板”开始。模板是CodeSmith的核心,它定义了生成代码的结构和...

    codesmith nettiers-2.3.1.zip codesmith 模板

    codesmith nettiers-2.3.1.zip codesmith 模板codesmith nettiers-2.3.1.zip codesmith 模板codesmith nettiers-2.3.1.zip codesmith 模板codesmith nettiers-2.3.1.zip codesmith 模板codesmith nettiers-2.3.1.zip...

    CodeSmith+注册码(注册机)

    CodeSmith+注册码(注册机)CodeSmith+注册码(注册机)CodeSmith+注册码(注册机)CodeSmith+注册码(注册机)CodeSmith+注册码(注册机)CodeSmith+注册码(注册机)CodeSmith+注册码(注册机)CodeSmith+注册码...

    CodeSmith基础.pdf

    CodeSmith是一款基于模板的代码生成器,它允许开发人员使用类似于数据库查询语言的标记语言来生成代码。CodeSmith提供了一系列模板,可以用来生成如C#、C++、Java等语言的代码,尤其在生成数据库访问层代码方面,...

    CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf

    CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf ...

    MySql数据库CodeSmith模板

    这大大减少了手动编写这些基础代码的时间。 CodeSmith支持使用C#语法作为模板语言,使得模板的编写更为直观和强大。你可以利用它提供的各种内置函数和变量,如数据库表信息、字段信息等,来动态生成代码。 总的来...

    CodeSmith

    总的来说,CodeSmith是一个高效能的代码生成工具,通过与数据库的交互和模板引擎,能够帮助开发者快速构建C#项目的基础架构。其丰富的配置选项和多样的运行方式适应了不同开发环境的需求,是提升开发效率的得力助手...

    CodeSmith 6.0 + 序列号

    CodeSmith是一款强大的代码生成工具,尤其对于程序员和开发团队来说,它能显著提高开发效率,减少重复编写基础代码的工作量。在标题中提到的"CodeSmith 6.0 + 序列号",指的是该软件的第六个主要版本,并且提供了一...

    CodeSmith初学者教程

    通过阅读和实践,你可以掌握CodeSmith的基础操作,并逐渐提升到高级应用。 总结,CodeSmith是一个强大的代码生成工具,通过学习和熟练运用,开发者能提高工作效率,降低出错率,专注在更重要的业务逻辑和创新上。...

    codesmith入门

    在codesmith中,模板是生成代码的基础,它们可以是预定义的,也可以由用户自行创建。预定义模板涵盖了如.NET集合类型和存储过程生成等功能。用户通过CodeSmith Studio.exe创建和编辑模板,而CodeSmith Explorer.exe...

    简单的CodeSmith模板

    "简单的CodeSmith模板"这个主题意味着我们将探讨如何创建一个基础的CodeSmith模板,以理解其工作原理和基本语法。 首先,让我们深入了解CodeSmith模板。模板是CodeSmith的核心,它是由CST(CodeSmith Template)...

    CodeSmith 4.1 Templates.rar

    此外,CodeSmith还支持模板继承,你可以创建一个基础模板,然后其他模板继承这个基础模板,只关注差异部分,这样维护起来更为方便。 "CodeSmith 4.1 Templates"压缩包内的文件可能是各个特定功能的模板文件,比如...

    CodeSmith生成SpringBoot模板

    总的来说,利用CodeSmith生成SpringBoot模板结合MyBatisPlus,可以有效地减少重复编码工作,提升开发效率,让开发者更专注于业务逻辑的实现,而不是基础代码的编写。通过熟练掌握这一技巧,可以为你的项目开发带来极...

    Java 代码生成器CodeSmith是一个好工具

    CodeSmith 是一种基于模板的代码生成工具,它使用类似于 ASP.NET 的语法来生成任意类型的代码或文本。与其他许多代码生成工具不同,CodeSmith 不要求您订阅特定的应用程序设计或体系结构。使用 CodeSmith,可以生成...

    CodeSmith代码生成器

    CodeSmith是一款强大的代码生成工具,尤其在提升软件开发效率方面有着显著的作用。它允许开发者通过模板语言来定制自己的代码生成规则,从而自动化地创建出符合特定项目需求的源代码。这款工具广泛应用于国内的开发...

    CodeSmith 生成工具 6.5 (可生成Nhibernate)

    CodeSmith是一款强大的代码生成工具,尤其在快速开发领域有着广泛的应用。版本6.5是它的一个重要里程碑,其中包含了对Nhibernate框架的支持,这使得开发者能够更高效地生成与Nhibernate配合的实体类和数据访问层代码...

    解决CodeSmith 8.0生成mysql实体没有字段注释和表注释,亲测好用

    CodeSmith是一款强大的代码生成工具,尤其适用于快速生成数据库相关的实体模型、数据访问层以及业务逻辑层代码。在本文中,我们将深入探讨如何解决在使用CodeSmith 8.0时遇到的MySQL实体没有字段注释和表注释的问题...

Global site tag (gtag.js) - Google Analytics