本文老周就给大伙伴们介绍一下方法参数代码的生成。

在开始之前,先补充一下上一篇烂文的内容。在上一篇文章中,老周检讨了 MemberAttributes 枚举的用法,老周此前误以为该枚举不能进行按位操作,后来发现是可以的。不过啊,MemberAttributes 枚举有些情况下不那么好弄,最典型的就是要生成抽象类的时候,反正老周试了很久,用MemberAttributes枚举不能顺利生成抽象类。

这时候,老周想到了 TypeAttributes,然后就试了一下。

            CodeTypeDeclaration t = new CodeTypeDeclaration("MyClass");
t.TypeAttributes = System.Reflection.TypeAttributes.Abstract; CodeMemberProperty pry = new CodeMemberProperty();
pry.Name = "A";
pry.Attributes = MemberAttributes.Abstract | MemberAttributes.Public;
pry.Type = new CodeTypeReference(typeof(string));
t.Members.Add(pry); CodeDomProvider p = CodeDomProvider.CreateProvider("cs");
p.GenerateCodeFromType(t, Console.Out, null);

把 TypeAttributes 属性设置为 Abstract ,就可以将类标识为抽象类。而抽象成员则可以将 Attributes 属性直接指定为抽象成员,比如上面例子中的A属性。

然后生成的代码如下图所示。

下面进入本文的要点——生成方法参数。

老周的习惯是,示例学习效率高。所以,我不多说理论的东西,来看例子。

            CodeMemberMethod m = new CodeMemberMethod();
m.Name = "SetData";
m.Attributes = MemberAttributes.Public | MemberAttributes.Final;
// 参数
CodeParameterDeclarationExpression p1 = new CodeParameterDeclarationExpression();
p1.Name = "name";
p1.Type = new CodeTypeReference(typeof(string));
m.Parameters.Add(p1);
CodeParameterDeclarationExpression p2 = new CodeParameterDeclarationExpression();
p2.Name = "city";
p2.Type = new CodeTypeReference(typeof(string));
m.Parameters.Add(p2);
CodeParameterDeclarationExpression p3 = new CodeParameterDeclarationExpression();
p3.Name = "phone";
p3.Type = new CodeTypeReference(typeof(int));
m.Parameters.Add(p3);
CodeCommentStatement cm = new CodeCommentStatement("方法体");
m.Statements.Add(cm); CodeDomProvider provider = CodeDomProvider.CreateProvider("cs");
provider.GenerateCodeFromMember(m, Console.Out, null);

别看这代码貌似有点长,其实就是声明一个方法,然后添加三个参数。参数的声明属于表达式,因此用到CodeParameterDeclarationExpression类,Type属性设置参数的类型。

示例代码中,CodeCommentStatement表示方法体中包含注释。

生成的方法如下图所示。

默认情况下,参数为输入参数,我们知道,还有两种方法参数——输出参数、引用传参。

CodeParameterDeclarationExpression 公开 Direction 属性,专门用于设置参数的方向,输入参数是默认值,因此可以不显式赋值,另外两个值就是Ref和Out。

下面代码将生成一个带有 out 参数的方法。

            CodeMemberMethod m3 = new CodeMemberMethod();
m3.Name = "MakeKey";
// 返回值
m3.ReturnType = new CodeTypeReference(typeof(bool));
// 输入参数
CodeParameterDeclarationExpression pi = new CodeParameterDeclarationExpression(typeof(int), "len");
m3.Parameters.Add(pi);
// 输出参数
CodeParameterDeclarationExpression po = new CodeParameterDeclarationExpression(typeof(byte[]), "res");
po.Direction = FieldDirection.Out; //重点
m3.Parameters.Add(po); Console.WriteLine("VB 代码:");
CodeDomProvider provider = CodeDomProvider.CreateProvider("vb");
provider.GenerateCodeFromMember(m3, Console.Out, null);
Console.WriteLine("\n\nC# 代码:");
provider = CodeDomProvider.CreateProvider("cs");
provider.GenerateCodeFromMember(m3, Console.Out, null);

要让参数变为输出参数,就要把 Direction 属性设置为 Out。

请看结果。

知道如何定义 out 参数,那ref参数就简单了,比如下面例子。

            // 定义类型
CodeTypeDeclaration dt = new CodeTypeDeclaration("MySocket");
// 方法成员
CodeMemberMethod mt = new CodeMemberMethod();
mt.Name = "ReadData";
mt.Attributes = MemberAttributes.Public;
// ref 参数
CodeParameterDeclarationExpression pr = new CodeParameterDeclarationExpression(typeof(System.Net.IPEndPoint), "endpoint");
pr.Direction = FieldDirection.Ref;
mt.Parameters.Add(pr);
dt.Members.Add(mt); CodeDomProvider provider = CodeDomProvider.CreateProvider("cs");
provider.GenerateCodeFromType(dt, Console.Out, null);

生成代码如下。

OK,今天的内容就讲完了,东西不多,也不难。下一篇文章,老周继续厚着脸皮和各位探讨 CodeDom,下一次将介绍一下特性的定义。

【.net 深呼吸】细说CodeDom(6):方法参数的更多相关文章

  1. 【.net 深呼吸】细说CodeDom(7):索引器

    在开始正题之前,先补充一点前面的内容. 在方法中,如果要引用方法参数,前面的示例中,老周使用的是 CodeVariableReferenceExpression 类,它用于引用变量,也适用于引用方法参 ...

  2. 【.net 深呼吸】细说CodeDom(5):类型成员

    前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...

  3. 【.net 深呼吸】细说CodeDom(4):类型定义

    上一篇文章中说了命名空间,你猜猜接下来该说啥.是了,命名空间下面就是类型,知道了如何生成命名空间的定义代码,之后就该学会如何声明类型了. CLR的类型通常有这么几种:类.接口.结构.枚举.委托.是这么 ...

  4. Eclipse中自动提示的方法参数都是arg0,arg1的解决方法

    Eclipse中自动提示的方法参数都是arg0,arg1,就不能根据参数名来推断参数的含义,非常不方便. 解决方法:Preferences->Java->Installed JREs,发现 ...

  5. java中方法参数的一些总结(1)

    1.问题说明        在C++中,函数调用时有传值调用和传址调用两种方式,但在Java中只有传值调用一种方式.Java中的方法参数为那几种基本数据类型的情况跟C++中一样,传入的只是变量的拷贝. ...

  6. php课程---Windows.open()方法参数详解

    Window.open()方法参数详解 1, 最基本的弹出窗口代码   window.open('page.html'); 2, 经过设置后的弹出窗口   window.open('page.html ...

  7. Scala正则和抽取器:解析方法参数

    在<正则表达式基础知识>中概括了正则表达式的基础知识, 本文讲解如何使用正则表达式解析方法参数,从而可以根据 DAO 自动生成 Service. 在做 Java 项目时,常常要根据 DAO ...

  8. java方法参数

    Java程序设计语言总是采用值调用.也就是说,方法得到的是所有参数的一个拷贝,特别是方法不能修改传递给它的任何参数变量的内容. 基本类型参数 1)X被初始化为percent值的一个拷贝: 2)X被乘以 ...

  9. 新手容易混乱的String+和StringBuffer,以及Java的方法参数传递方式。

    之前在交流群里和猿友们讨论string+和stringbuffer哪个速度快以及Java的方法参数传递的问题,引起了群里猿友的小讨论.最终LZ得出的结果是string+没有stringbuffer快, ...

随机推荐

  1. 读书笔记:《HTML5开发手册》--HTML5新的结构元素

    读书笔记:<HTML5开发手册> (HTML5 Developer's CookBook) 虽然从事前端开发已有很长一段时间,对HTML5标签也有使用,但在语义化上面理解还不够清晰.之前在 ...

  2. 探索C#之6.0语法糖剖析

    阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...

  3. Hyper-V3:虚拟机的配置

    在Hyper-V成功新建一台虚拟机,在正式使用之前,必须配置VM使用的硬件资源,并授予用户访问VM的权限等,本文罗列出一些常见的配置,供读者参阅. 一,为虚拟机分配使用的内存 在Hyper-V Man ...

  4. webapp应用--模拟电子书翻页效果

    前言: 现在移动互联网发展火热,手机上网的用户越来越多,甚至大有超过pc访问的趋势.所以,用web程序做出仿原生效果的移动应用,也变得越来越流行了.这种程序也就是我们常说的单页应用程序,它也有一个英文 ...

  5. 创建APPID&&部署服务端教程

    创建APPID&&部署服务端 一.创建APPID 1.打开https://console.developers.google.com ,左击顶部Project,然后左击创建项目 2.输 ...

  6. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  7. Oracle常用SQL函数整理

    --返回ASCII码select  ASCII('A') "A的ASCII码" ,ASCII('a') "a的ASSCII码" from dual ; --反向 ...

  8. SVN版本冲突,导致出现Files 的值“ < < < < < < < .mine”无效

    只要根据错误提示,找到相应文件夹下的\obj\Debug文件夹下的 相应名字.csproj.FileListAbsolute.txt, 打开并删除含有'<<<<<< ...

  9. Linux程序包管理之rpm

    rpm简介 rpm( Red Hat Package Manager )是一个开放的软件包管理系统.它工作于Red Hat Linux及其他Linux系统,成为Linux中公认的软件包管理标准. rp ...

  10. BZOJ3198[SDOI2013]SPRING

    Description Input Output Sample Input 3 3 1 2 3 4 5 6 1 2 3 0 0 0 0 0 0 4 5 6 Sample Output 2 HINT 题 ...