技术开发 频道

.NET 时代里的AOP


CodeDom句法

    最好的方法是通过例子来学习CodeDom,因此来看一下某种C#代码,以及它对等的CodeDom语句(我们假设它们都发生在类型内部)。被下载的代码包括一个项目,以此来检查CodeDomTester文件夹中的CodeDom。它是一个简单的控制器应用程序,在此控制器应用程序上有两个骨架方法:GetMembers和GetStatements。可以把样本CodeDom代码放到这两个方法中,看一下输出的结果。
C#:
private string somefield;
CodeDom:
CodeMemberField field = new CodeMemberField(typeof(string), "somefield");
   所有类型层成员表示法CodeMemberEvent, CodeMemberField, CodeMemberMethod and CodeMemberProperty,都是从CodeTypeMember继承来的,默认地拥有private和final属性。

C#:
public string somefield = "SomeValue";
CodeDom:
CodeMemberField field = new CodeMemberField(typeof(string), "somefield");
field.InitExpression = new CodePrimitiveExpression("SomeValue");
field.Attributes = MemberAttributes.Public;
C#
this.somefield = GetValue();
CodeDom:
CodeFieldReferenceExpression field = new CodeFieldReferenceExpression( 
new CodeThisReferenceExpression(), "somefield");
CodeMethodInvokeExpression getvalue = new CodeMethodInvokeExpression(
new CodeThisReferenceExpression(), "GetValue", new CodeExpression[0]);
CodeAssignStatement assign = new CodeAssignStatement(field, getvalue);
   注意:实际上冗长的程度按指数倍增加。并且注意C#代码中的GetValue()方法对此有一个隐式引用,在CodeDom中必须是显示的。

C#
this.GetValue("Someparameter", this.somefield);
CodeDom
CodeMethodInvokeExpression call = new CodeMethodInvokeExpression(); 
call.Method = new CodeMethodReferenceExpression(
new CodeThisReferenceExpression(), "GetValue");
call.Parameters.Add(new CodePrimitiveExpression("Someparameter"));
CodeFieldReferenceExpression field = new
CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "somefield");
call.Parameters.Add(field);
   我们调用同一方法的一个假定超载。注意首先创建方法调用表示法,然后为它(指向this)指定一个方法引用和一个方法名称。下面附加两个参数,第二个单元是这个领域的引用。

    如果想避免无尽的而且没用的变量声明,不采用临时变量就可以创建语句。这使得代码不那么清晰易读,但是更加紧凑。创建这些语法的一个好技术就是考虑目标代码,从内部向外部生成目标代码。例如在上面的代码中。
this.GetValue("Someparameter", this.somefield);
   首先创建参数,然后考虑方法引用,一旦想做这些工作,写下下面这些东西:
CodeMethodInvokeExpression call = 
new CodeMethodInvokeExpression(new CodeThisReferenceExpression(),
"GetValue",
new CodeExpression[] { new CodePrimitiveExpression("Someparameter"),
new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),
"somefield")});
    我们看到的最后情况是一个this.somefield,然后是原始表示法。这是作为方法调用的参数阵列的初始化表示法而传递的。然后你得到this.somefield,最后this.somefield引发实际调用。

    注意正确的缩排可以提供巨大的帮助,但是大部分工作还是需要你自己完成,尤其是一些附带有巢状层次的工作。为了达到一些合法性,最重要的巢状就是阵列初始化(前面所提到的)。也推荐把预期C# (or VB.NET)输出代码放到多线语句上面,因此每个人都知道你试图发送什么。

    这些是定义所有跨语言功能的类型。但是让我们看一下需要给被扩展属性提供的具体持续性代码。
0
相关文章