<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Coding Day &#187; Software</title>
	<atom:link href="http://www.codingday.com/category/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codingday.com</link>
	<description>Adventures in Computing, Can Erten's blog</description>
	<lastBuildDate>Tue, 13 Jul 2010 12:52:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>LINQ Expression Trees-Lambdas to CodeDom Conversion</title>
		<link>http://www.codingday.com/meta-programming-with-expression-trees-lambdas-to-codedom-conversion/</link>
		<comments>http://www.codingday.com/meta-programming-with-expression-trees-lambdas-to-codedom-conversion/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 00:23:34 +0000</pubDate>
		<dc:creator>Can</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[linq]]></category>

		<guid isPermaLink="false">http://www.canerten.com/meta-programming-with-expression-trees-lambdas-to-codedom-conversion/</guid>
		<description><![CDATA[Introduction Some people are working to make the meta-programming possible. Some says as language oriented programming or domain specific language, but I prefer in general as meta-programming. For years programming languages supported to generate code with the powerful libraries or developers worked just with string concatenations and external linkers. Nowadays meta-programming is getting more and [...]]]></description>
			<content:encoded><![CDATA[<h1>Introduction</h1>
<p>Some people are working to make the meta-programming possible. Some says as language oriented programming or domain specific language, but I prefer in general as meta-programming. For years programming languages supported to generate code with the powerful libraries or developers worked just with string concatenations and external linkers.
<p>Nowadays meta-programming is getting more and more important as the domain expertise required. So the languages make meta programming possible at the compiler level with compiler directives.
<p>Indeed there a lot of ideas coming from functional programming world where everything treated as expressions.&nbsp; The code becomes data and data usage happens in the code. It should sound familiar with LINQ to SQL efforts to make this possible.<br />
<h1>Libraries</h1>
<p>.NET Framework had code generators since the beginning. CodeDom is probably the best known for tree based code generation. Codedom made possible to develop the ASP.NET engine, Windows Form designer, Web form designer, Web services wrapper LINQ entity objects and more. It is used extensively by the framework for the key technologies.
<p>Although there are other APIs in .NET framework such as System.Reflection, System.Reflection.Emit, in this post we will focus on CodeDom and the new comer Expression Trees.
<p>Expression Tree is the key API behind LINQ to SQL or IQueryable interface in general. Every query is expressed as typed trees that is parsed and converted to SQL later by the library.
<p>The syntax of expressing queries is very readable with query comprehension syntax. However sometimes I want to know about the generated tree, like actually which functions are getting involved in the query. I have used <a href="http://blogs.msdn.com/charlie/archive/2008/01/31/expression-tree-basics.aspx" target="_blank">Expression Tree Debugger Visualizer</a> to draw the tree. It is pretty handy tool but for big trees it is difficult to see what is going on. This was my main motivation actually, although we had the code, we don&#8217;t see what&#8217;s the magic going on with query comprehension.<br />
<h1>Implementation</h1>
<p>So the idea is to have the code regenerated from the tree. In the real world this will involve a parser, interpreter and some more compiler theory which requires a lot of research. And because this is just for fun and since we have a powerful CodeDom library to generate code, I tried to convert the expression tree to CodeDom tree. Than used the CodeDom to generate code in any language. Finally I wrote the extension methods so that the debuggers and my code can use it directly from the type.</p>
<p>The compiler generates automatically the expression trees if we use the proper syntax. So from the beginning we have the tree. In order to convert to CodeDom objects, we need to traverse the tree and generate the necessary CodeDom objects. So I wrote a&nbsp; tree walker that generates a CodeDom object to is parent while going to the last children. I didn&#8217;t realise how far it is going but that was it. When the tree walker finished with some more few lines of code the converter was just working. </p>
<p>I would like to put the code here as well but unfortunately it is too long for a blog post, so here are some snippets. Feel free to provide suggestions or bug reports.</p>
<p>LINQ Expression Visitor that generates CodeDom Trees
</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Linq</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Text</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Collections.ObjectModel</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Linq.Expressions</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Reflection</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.CodeDom</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.CodeDom.Compiler</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.IO</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">namespace</span> ExpressionToCodedom
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span>  <span style="color: #FF0000;">class</span> CodeDomExpressionVisitor
    <span style="color: #000000;">&#123;</span>
&nbsp;
        Expression m_exp<span style="color: #008000;">;</span>
        Dictionary<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span>, CodeTypeMember<span style="color: #008000;">&gt;</span> m_members<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> CodeDomExpressionVisitor<span style="color: #000000;">&#40;</span>Expression e<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            m_exp <span style="color: #008000;">=</span> e<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
        <span style="color: #0600FF;">internal</span> <span style="color: #FF0000;">string</span> GenerateSource<span style="color: #000000;">&#40;</span>CodeDomProvider codeProvider<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            StringBuilder sb <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StringBuilder<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            TextWriter tWriter <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> IndentedTextWriter<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> StringWriter<span style="color: #000000;">&#40;</span>sb<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            CodeCompileUnit ccu <span style="color: #008000;">=</span> GenerateCode<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            codeProvider.<span style="color: #0000FF;">GenerateCodeFromCompileUnit</span><span style="color: #000000;">&#40;</span>ccu, tWriter, <span style="color: #008000;">new</span> CodeGeneratorOptions<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            codeProvider.<span style="color: #0000FF;">Dispose</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            tWriter.<span style="color: #0000FF;">Close</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">return</span> sb.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">internal</span> <span style="color: #FF0000;">string</span> GenerateSource<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> language<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
&nbsp;
&nbsp;
            CodeDomProvider codeProvider<span style="color: #008000;">=</span>null<span style="color: #008000;">;</span>
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>language <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;cs&quot;</span><span style="color: #000000;">&#41;</span>
                codeProvider <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Microsoft.<span style="color: #0000FF;">CSharp</span>.<span style="color: #0000FF;">CSharpCodeProvider</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>language <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;vb&quot;</span><span style="color: #000000;">&#41;</span>
                codeProvider <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Microsoft.<span style="color: #0000FF;">VisualBasic</span>.<span style="color: #0000FF;">VBCodeProvider</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">else</span>
            <span style="color: #000000;">&#123;</span>                
&nbsp;
                    <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> Exception<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;make sure you are trying to load a CodeDomProvider assembly&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">return</span> GenerateSource<span style="color: #000000;">&#40;</span>codeProvider<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> 
&nbsp;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> GenerateSource<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">return</span> GenerateSource<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;cs&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> 
        <span style="color: #000000;">&#125;</span>
&nbsp;
&nbsp;
        <span style="color: #0600FF;">private</span> CodeCompileUnit GenerateCode<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            var code <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CodeCompileUnit<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            m_members <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Dictionary<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span>, CodeTypeMember<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            var LambdaTypeClass <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CodeTypeDeclaration<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;LambdaExpression&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            var ns <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CodeNamespace<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Runtime&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            ns.<span style="color: #0000FF;">Types</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>LambdaTypeClass<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>            
            ns.<span style="color: #0000FF;">Imports</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> CodeNamespaceImport<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;System&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">// add more types in case I want to compile</span>
&nbsp;
            code.<span style="color: #0000FF;">Namespaces</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>ns<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            CodeObject cEvaluationResult <span style="color: #008000;">=</span> Visit<span style="color: #000000;">&#40;</span>m_exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            var constructor <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CodeConstructor<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>cEvaluationResult <span style="color: #008000;">is</span> CodeStatement<span style="color: #000000;">&#41;</span>
                constructor.<span style="color: #0000FF;">Statements</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>cEvaluationResult <span style="color: #0600FF;">as</span> CodeStatement<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>cEvaluationResult <span style="color: #008000;">is</span> CodeExpression<span style="color: #000000;">&#41;</span>
                constructor.<span style="color: #0000FF;">Statements</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>cEvaluationResult <span style="color: #0600FF;">as</span> CodeExpression<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            LambdaTypeClass.<span style="color: #0000FF;">Members</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>constructor<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
&nbsp;
            <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>var item <span style="color: #0600FF;">in</span> m_members<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                LambdaTypeClass.<span style="color: #0000FF;">Members</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>item.<span style="color: #0000FF;">Value</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF;">return</span> code<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject Visit<span style="color: #000000;">&#40;</span>Expression exp<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>exp <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
                <span style="color: #0600FF;">return</span> null<span style="color: #008000;">;</span>
            <span style="color: #0600FF;">switch</span> <span style="color: #000000;">&#40;</span>exp.<span style="color: #0000FF;">NodeType</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Negate</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">NegateChecked</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Not</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Convert</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">ConvertChecked</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">ArrayLength</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Quote</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">TypeAs</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitUnary</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>UnaryExpression<span style="color: #000000;">&#41;</span>exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Add</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">AddChecked</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Subtract</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">SubtractChecked</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Multiply</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">MultiplyChecked</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Divide</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Modulo</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">And</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">AndAlso</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Or</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">OrElse</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">LessThan</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">LessThanOrEqual</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">GreaterThan</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">GreaterThanOrEqual</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Equal</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">NotEqual</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Coalesce</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">ArrayIndex</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">RightShift</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">LeftShift</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">ExclusiveOr</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitBinary</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>BinaryExpression<span style="color: #000000;">&#41;</span>exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">TypeIs</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitTypeIs</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>TypeBinaryExpression<span style="color: #000000;">&#41;</span>exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Conditional</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitConditional</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>ConditionalExpression<span style="color: #000000;">&#41;</span>exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Constant</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitConstant</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>ConstantExpression<span style="color: #000000;">&#41;</span>exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Parameter</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitParameter</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>ParameterExpression<span style="color: #000000;">&#41;</span>exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">MemberAccess</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitMemberAccess</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>MemberExpression<span style="color: #000000;">&#41;</span>exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Call</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitMethodCall</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>MethodCallExpression<span style="color: #000000;">&#41;</span>exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Lambda</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitLambda</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>LambdaExpression<span style="color: #000000;">&#41;</span>exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #008000;">New</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitNew</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>NewExpression<span style="color: #000000;">&#41;</span>exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">NewArrayInit</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">NewArrayBounds</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitNewArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>NewArrayExpression<span style="color: #000000;">&#41;</span>exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Invoke</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitInvocation</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>InvocationExpression<span style="color: #000000;">&#41;</span>exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">MemberInit</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitMemberInit</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>MemberInitExpression<span style="color: #000000;">&#41;</span>exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">ListInit</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitListInit</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>ListInitExpression<span style="color: #000000;">&#41;</span>exp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">default</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> Exception<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span>.<span style="color: #0000FF;">Format</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Unhandled expression type: '{0}'&quot;</span>, exp.<span style="color: #0000FF;">NodeType</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject VisitBinding<span style="color: #000000;">&#40;</span>MemberBinding binding<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>            
            <span style="color: #0600FF;">switch</span> <span style="color: #000000;">&#40;</span>binding.<span style="color: #0000FF;">BindingType</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">case</span> MemberBindingType.<span style="color: #0000FF;">Assignment</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitMemberAssignment</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>MemberAssignment<span style="color: #000000;">&#41;</span>binding<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> MemberBindingType.<span style="color: #0000FF;">MemberBinding</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitMemberMemberBinding</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>MemberMemberBinding<span style="color: #000000;">&#41;</span>binding<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">case</span> MemberBindingType.<span style="color: #0000FF;">ListBinding</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitMemberListBinding</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>MemberListBinding<span style="color: #000000;">&#41;</span>binding<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">default</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> Exception<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span>.<span style="color: #0000FF;">Format</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Unhandled binding type '{0}'&quot;</span>, binding.<span style="color: #0000FF;">BindingType</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeExpression VisitElementInitializer<span style="color: #000000;">&#40;</span>ElementInit initializer<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>            
            ReadOnlyCollection<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span> arguments <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitExpressionList</span><span style="color: #000000;">&#40;</span>initializer.<span style="color: #0000FF;">Arguments</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> CodeMethodInvokeExpression<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> CodeMethodReferenceExpression<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> CodeThisReferenceExpression<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>,initializer.<span style="color: #0000FF;">AddMethod</span>.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span>, arguments.<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>                               
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject VisitUnary<span style="color: #000000;">&#40;</span>UnaryExpression u<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            CodeObject operand <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>u.<span style="color: #0000FF;">Operand</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">return</span> operand<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">private</span> CodeBinaryOperatorType BindOperant<span style="color: #000000;">&#40;</span>ExpressionType e<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">switch</span> <span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Add</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">AddChecked</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">Add</span><span style="color: #008000;">;</span>
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">And</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">BitwiseAnd</span><span style="color: #008000;">;</span>
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">AndAlso</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">BooleanAnd</span><span style="color: #008000;">;</span>                  
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Or</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">BitwiseOr</span><span style="color: #008000;">;</span>                    
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">OrElse</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">BooleanOr</span><span style="color: #008000;">;</span>                    
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">ExclusiveOr</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">ArrayIndex</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Coalesce</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">RightShift</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">LeftShift</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotSupportedException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;no direct equivalent in codedom,so workarounds not implemented&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Equal</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">IdentityEquality</span><span style="color: #008000;">;</span>
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">NotEqual</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">IdentityInequality</span><span style="color: #008000;">;</span>                    
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">GreaterThan</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">GreaterThan</span><span style="color: #008000;">;</span>                    
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">GreaterThanOrEqual</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">GreaterThanOrEqual</span><span style="color: #008000;">;</span>                    
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">LessThan</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">LessThan</span><span style="color: #008000;">;</span>                    
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">LessThanOrEqual</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">LessThanOrEqual</span><span style="color: #008000;">;</span>                    
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Multiply</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">MultiplyChecked</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">Multiply</span><span style="color: #008000;">;</span>
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Subtract</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">SubtractChecked</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">Subtract</span><span style="color: #008000;">;</span>
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Power</span><span style="color: #008000;">:</span>
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Divide</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">Divide</span><span style="color: #008000;">;</span>
&nbsp;
                <span style="color: #0600FF;">case</span> ExpressionType.<span style="color: #0000FF;">Modulo</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">return</span> CodeBinaryOperatorType.<span style="color: #0000FF;">Modulus</span><span style="color: #008000;">;</span>
&nbsp;
                <span style="color: #0600FF;">default</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> Exception<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;are you sure you are right?&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeBinaryOperatorExpression VisitBinary<span style="color: #000000;">&#40;</span>BinaryExpression b<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            var left <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>b.<span style="color: #0000FF;">Left</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">as</span> CodeExpression<span style="color: #008000;">;</span>
            var right <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>b.<span style="color: #0000FF;">Right</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">as</span> CodeExpression<span style="color: #008000;">;</span>
            CodeObject conversion <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>b.<span style="color: #0000FF;">Conversion</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            CodeBinaryOperatorType operant <span style="color: #008000;">=</span> BindOperant<span style="color: #000000;">&#40;</span>b.<span style="color: #0000FF;">NodeType</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>           
            var condExpr <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CodeBinaryOperatorExpression<span style="color: #000000;">&#40;</span>left, operant, right<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">return</span> condExpr<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject VisitTypeIs<span style="color: #000000;">&#40;</span>TypeBinaryExpression b<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>            
            CodeObject expr <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>b.<span style="color: #0000FF;">Expression</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>          
            <span style="color: #0600FF;">return</span> expr<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeExpression VisitConstant<span style="color: #000000;">&#40;</span>ConstantExpression c<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>c.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> CodePrimitiveExpression<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>c.<span style="color: #0000FF;">Value</span>.<span style="color: #0000FF;">GetType</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">IsValueType</span> <span style="color: #008000;">||</span> c.<span style="color: #0000FF;">Value</span>.<span style="color: #0000FF;">GetType</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                   <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> CodePrimitiveExpression<span style="color: #000000;">&#40;</span>c.<span style="color: #0000FF;">Value</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">else</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> CodeVariableReferenceExpression<span style="color: #000000;">&#40;</span>c.<span style="color: #0000FF;">Value</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>             
            <span style="color: #000000;">&#125;</span>                        
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject VisitConditional<span style="color: #000000;">&#40;</span>ConditionalExpression c<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>            
            CodeObject test <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>c.<span style="color: #0000FF;">Test</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            CodeExpression ifTrue <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>c.<span style="color: #0000FF;">IfTrue</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">as</span> CodeExpression<span style="color: #008000;">;</span>
            CodeExpression ifFalse <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>c.<span style="color: #0000FF;">IfFalse</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">as</span> CodeExpression<span style="color: #008000;">;</span>
&nbsp;
            var ifStatement <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CodeConditionStatement<span style="color: #000000;">&#40;</span>test <span style="color: #0600FF;">as</span> CodeExpression,
                                                         <span style="color: #008000;">new</span> CodeStatement<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span><span style="color: #008000;">new</span> CodeExpressionStatement<span style="color: #000000;">&#40;</span>ifTrue<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#125;</span>, 
                                                         <span style="color: #008000;">new</span> CodeStatement<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span><span style="color: #008000;">new</span> CodeExpressionStatement<span style="color: #000000;">&#40;</span>ifFalse<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>                    
            <span style="color: #0600FF;">return</span> ifStatement<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject VisitParameter<span style="color: #000000;">&#40;</span>ParameterExpression p<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> CodeArgumentReferenceExpression<span style="color: #000000;">&#40;</span>p.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>            
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject VisitMemberAccess<span style="color: #000000;">&#40;</span>MemberExpression m<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
&nbsp;
            CodeObject exp <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>m.<span style="color: #0000FF;">Expression</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>exp <span style="color: #008000;">is</span> CodePrimitiveExpression<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">return</span> exp<span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">else</span>
            <span style="color: #000000;">&#123;</span>
                Type memType<span style="color: #008000;">;</span>
                <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>m.<span style="color: #0000FF;">Member</span>.<span style="color: #0000FF;">MemberType</span> <span style="color: #008000;">==</span> MemberTypes.<span style="color: #0000FF;">Field</span><span style="color: #000000;">&#41;</span>
                    memType <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>m.<span style="color: #0000FF;">Member</span> <span style="color: #0600FF;">as</span> FieldInfo<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">FieldType</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">else</span> memType <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>m.<span style="color: #0000FF;">Member</span> <span style="color: #0600FF;">as</span> PropertyInfo<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">PropertyType</span><span style="color: #008000;">;</span>
&nbsp;
&nbsp;
                m_members<span style="color: #000000;">&#91;</span>m.<span style="color: #0000FF;">Member</span>.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CodeMemberField<span style="color: #000000;">&#40;</span>memType, m.<span style="color: #0000FF;">Member</span>.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> CodeVariableReferenceExpression<span style="color: #000000;">&#40;</span>m.<span style="color: #0000FF;">Member</span>.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>    
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject VisitMethodCall<span style="color: #000000;">&#40;</span>MethodCallExpression m<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>           
            CodeObject obj <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>m.<span style="color: #FF0000;">Object</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            IEnumerable<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span> args <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitExpressionList</span><span style="color: #000000;">&#40;</span>m.<span style="color: #0000FF;">Arguments</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>obj <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>  <span style="color: #008080; font-style: italic;">//static method call</span>
                <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> CodeMethodInvokeExpression<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> CodeTypeReferenceExpression<span style="color: #000000;">&#40;</span>m.<span style="color: #0000FF;">Method</span>.<span style="color: #0000FF;">DeclaringType</span><span style="color: #000000;">&#41;</span>,m.<span style="color: #0000FF;">Method</span>.<span style="color: #0000FF;">Name</span>,args.<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>                
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">else</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> CodeMethodInvokeExpression<span style="color: #000000;">&#40;</span>obj <span style="color: #0600FF;">as</span> CodeExpression, m.<span style="color: #0000FF;">Method</span>.<span style="color: #0000FF;">Name</span>, args.<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>   
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> ReadOnlyCollection<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span> VisitExpressionList<span style="color: #000000;">&#40;</span>ReadOnlyCollection<span style="color: #008000;">&lt;</span>Expression<span style="color: #008000;">&gt;</span> original<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            List<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span> list <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span>, n <span style="color: #008000;">=</span> original.<span style="color: #0000FF;">Count</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;</span> n<span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                CodeExpression p <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>CodeExpression<span style="color: #000000;">&#41;</span><span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>original<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>                
                    list.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>p<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>                
            <span style="color: #000000;">&#125;</span>            
            <span style="color: #0600FF;">return</span> list.<span style="color: #0000FF;">AsReadOnly</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeExpression VisitMemberAssignment<span style="color: #000000;">&#40;</span>MemberAssignment assignment<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span><span style="color: #008080; font-style: italic;">// thhose are properties</span>
&nbsp;
            CodeObject e <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>assignment.<span style="color: #0000FF;">Expression</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">return</span> e <span style="color: #0600FF;">as</span> CodeExpression<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject VisitMemberMemberBinding<span style="color: #000000;">&#40;</span>MemberMemberBinding binding<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
&nbsp;
            IEnumerable<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span> bindings <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitBindingList</span><span style="color: #000000;">&#40;</span>binding.<span style="color: #0000FF;">Bindings</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">as</span> IEnumerable<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;;</span>
            <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> CodeObjectCreateExpression<span style="color: #000000;">&#40;</span>binding.<span style="color: #0000FF;">Member</span>.<span style="color: #0000FF;">Name</span>, bindings.<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>            
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject VisitMemberListBinding<span style="color: #000000;">&#40;</span>MemberListBinding binding<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
&nbsp;
            IEnumerable<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span> initializers <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitElementInitializerList</span><span style="color: #000000;">&#40;</span>binding.<span style="color: #0000FF;">Initializers</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> CodeObjectCreateExpression<span style="color: #000000;">&#40;</span>binding.<span style="color: #0000FF;">Member</span>.<span style="color: #0000FF;">Name</span>, initializers.<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> IEnumerable<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span> VisitBindingList<span style="color: #000000;">&#40;</span>ReadOnlyCollection<span style="color: #008000;">&lt;</span>MemberBinding<span style="color: #008000;">&gt;</span> original<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            List<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span> list <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span>, n <span style="color: #008000;">=</span> original.<span style="color: #0000FF;">Count</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;</span> n<span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                CodeExpression b <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitBinding</span><span style="color: #000000;">&#40;</span>original<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">as</span> CodeExpression<span style="color: #008000;">;</span>
&nbsp;
                    list.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>b<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">return</span> list<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> IEnumerable<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span> VisitElementInitializerList<span style="color: #000000;">&#40;</span>ReadOnlyCollection<span style="color: #008000;">&lt;</span>ElementInit<span style="color: #008000;">&gt;</span> original<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            List<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span> list <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span>, n <span style="color: #008000;">=</span> original.<span style="color: #0000FF;">Count</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;</span> n<span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                CodeExpression init <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitElementInitializer</span><span style="color: #000000;">&#40;</span>original<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                list.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>init<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #000000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF;">return</span> list<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> CodeMethodReferenceExpression VisitLambda<span style="color: #000000;">&#40;</span>LambdaExpression lambda<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            var  body <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>lambda.<span style="color: #0000FF;">Body</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            var lambdaMethod <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CodeMemberMethod<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            lambdaMethod.<span style="color: #0000FF;">Name</span> <span style="color: #008000;">=</span> lambda.<span style="color: #0000FF;">Type</span>.<span style="color: #0000FF;">Name</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>lambdaMethod.<span style="color: #0000FF;">Name</span>.<span style="color: #0000FF;">Contains</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Func&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
                lambdaMethod.<span style="color: #0000FF;">ReturnType</span> <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CodeTypeReference<span style="color: #000000;">&#40;</span>lambda.<span style="color: #0000FF;">Body</span>.<span style="color: #0000FF;">Type</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>var item <span style="color: #0600FF;">in</span> lambda.<span style="color: #0000FF;">Parameters</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                lambdaMethod.<span style="color: #0000FF;">Parameters</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> CodeParameterDeclarationExpression<span style="color: #000000;">&#40;</span>item.<span style="color: #0000FF;">Type</span>, item.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>body <span style="color: #008000;">is</span> CodeExpression<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>lambdaMethod.<span style="color: #0000FF;">ReturnType</span>.<span style="color: #0000FF;">BaseType</span>.<span style="color: #0000FF;">Contains</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Void&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
                    lambdaMethod.<span style="color: #0000FF;">Statements</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>body <span style="color: #0600FF;">as</span> CodeExpression <span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                <span style="color: #0600FF;">else</span>
                    lambdaMethod.<span style="color: #0000FF;">Statements</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> CodeMethodReturnStatement<span style="color: #000000;">&#40;</span>body <span style="color: #0600FF;">as</span> CodeExpression<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>body <span style="color: #008000;">is</span> CodeStatement<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                    lambdaMethod.<span style="color: #0000FF;">Statements</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>body <span style="color: #0600FF;">as</span> CodeStatement<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">else</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> Exception<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;investigate...&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
            m_members<span style="color: #000000;">&#91;</span>lambda.<span style="color: #0000FF;">Type</span>.<span style="color: #0000FF;">FullName</span><span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> lambdaMethod<span style="color: #008000;">;</span>
            <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> CodeMethodReferenceExpression<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> CodeThisReferenceExpression<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, lambdaMethod.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject VisitNew<span style="color: #000000;">&#40;</span>NewExpression nex<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>            
            IEnumerable<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span> args <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitExpressionList</span><span style="color: #000000;">&#40;</span>nex.<span style="color: #0000FF;">Arguments</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
&nbsp;
            <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> CodeObjectCreateExpression<span style="color: #000000;">&#40;</span>nex.<span style="color: #0000FF;">Type</span>.<span style="color: #0000FF;">Name</span>,args.<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject VisitMemberInit<span style="color: #000000;">&#40;</span>MemberInitExpression init<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            CodeObject n <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitNew</span><span style="color: #000000;">&#40;</span>init.<span style="color: #0000FF;">NewExpression</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            CodeExpression<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> bindings <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitBindingList</span><span style="color: #000000;">&#40;</span>init.<span style="color: #0000FF;">Bindings</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//binding will return property initialisation</span>
&nbsp;
&nbsp;
            <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;</span> init.<span style="color: #0000FF;">Bindings</span>.<span style="color: #0000FF;">Count</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>            
            <span style="color: #000000;">&#123;</span>
                                                                    <span style="color: #008080; font-style: italic;">// need to do something with that////</span>
                var assignProperty <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CodeAssignStatement<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> CodePropertyReferenceExpression<span style="color: #000000;">&#40;</span>
                            n <span style="color: #0600FF;">as</span> CodeExpression, init.<span style="color: #0000FF;">Bindings</span><span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">Member</span>.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span>, bindings<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>                                   
&nbsp;
            <span style="color: #0600FF;">return</span> n<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject VisitListInit<span style="color: #000000;">&#40;</span>ListInitExpression init<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
&nbsp;
            CodeObject n <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitNew</span><span style="color: #000000;">&#40;</span>init.<span style="color: #0000FF;">NewExpression</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            IEnumerable<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span> initializers <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitElementInitializerList</span><span style="color: #000000;">&#40;</span>init.<span style="color: #0000FF;">Initializers</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">return</span> n<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject VisitNewArray<span style="color: #000000;">&#40;</span>NewArrayExpression na<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
&nbsp;
            IEnumerable<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span> exprs <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitExpressionList</span><span style="color: #000000;">&#40;</span>na.<span style="color: #0000FF;">Expressions</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
&nbsp;
            <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> CodeArrayCreateExpression<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> CodeTypeReference<span style="color: #000000;">&#40;</span>na.<span style="color: #0000FF;">Type</span><span style="color: #000000;">&#41;</span>, exprs.<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> CodeObject VisitInvocation<span style="color: #000000;">&#40;</span>InvocationExpression iv<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>            
            IEnumerable<span style="color: #008000;">&lt;</span>CodeExpression<span style="color: #008000;">&gt;</span> args <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">VisitExpressionList</span><span style="color: #000000;">&#40;</span>iv.<span style="color: #0000FF;">Arguments</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            var expr <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>iv.<span style="color: #0000FF;">Expression</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">as</span> CodeExpression<span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> CodeMethodInvokeExpression<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> CodeMethodReferenceExpression<span style="color: #000000;">&#40;</span>expr, <span style="color: #666666;">&quot;Method&quot;</span><span style="color: #000000;">&#41;</span>, args.<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>            
        <span style="color: #000000;">&#125;</span>      
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>
<div class='download-link'>
							<a href='http://www.codingday.com/download.php?file=http://www.codingday.com/downloads/Expression_Source.zip'><img alt='Download' class='leftalign' src='http://www.codingday.com/wp-content/plugins/dBeautifier/icons/tar.png' /></a>
							<h4>
								<a href='http://www.codingday.com/download.php?file=http://www.codingday.com/downloads/Expression_Source.zip'>Expression Tree to CodeDom Source Code</a>
							</h4><p>Downloads: 227  File Name: Expression_Source.zip</p>
						</div><br />
<div class='download-link'>
							<a href='http://www.codingday.com/download.php?file=http://www.codingday.com/downloads/ExpressionToCodedom.dll'><img alt='Download' class='leftalign' src='http://www.codingday.com/wp-content/plugins/dBeautifier/icons/downloads.png' /></a>
							<h4>
								<a href='http://www.codingday.com/download.php?file=http://www.codingday.com/downloads/ExpressionToCodedom.dll'>Expression Tree to CodeDom DLL</a>
							</h4><p>Downloads: 126  File Name: ExpressionToCodedom.dll</p>
						</div>
</p>
<h1>Example</h1>
<p>The extension methods enables to see the source code of any IQueryable and any Expression. Any of them have a GenerateSourceCodeMethod that gives back a string.</p>
<p><a href='http://www.codingday.com/wp-content/uploads/2008/02/visualizer.jpg' title='Expression Tree to CodeDom Visualizer'><img src='http://www.codingday.com/wp-content/uploads/2008/02/visualizer.thumbnail.jpg' alt='Expression Tree to CodeDom Visualizer' /></a></p>
<p>GenerateSourceCode(); // default C#</p>
<p>GenerateSourceCode(string language); // either cs or vb as input or&nbsp; Fully qualified name of the CodeDomProvider (like Microsoft.FSharp.Compiler.CodeDom.FSharpCodeProvider) It should be added as a reference to the project if you&#8217;re going to use it. </p>
<p>
Sample program that manipulates the expression trees and usage of CodeDom Converter with &#8220;item.GetCodeDomSource(&#8220;vb&#8221;)&#8221;</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">int</span> a <span style="color: #008000;">=</span> <span style="color: #FF0000;">3</span>, c <span style="color: #008000;">=</span> <span style="color: #FF0000;">2</span>, d <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
&nbsp;
var e1 <span style="color: #008000;">=</span> Expression.<span style="color: #0000FF;">Constant</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">5</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
var e2 <span style="color: #008000;">=</span> Expression.<span style="color: #0000FF;">And</span><span style="color: #000000;">&#40;</span>e1, e1<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
Expression<span style="color: #008000;">&lt;</span>Func<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span>, Func<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">bool</span><span style="color: #008000;">&gt;&gt;&gt;</span> e3 <span style="color: #008000;">=</span> tbool <span style="color: #008000;">=&gt;</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> a <span style="color: #008000;">&lt;</span> b <span style="color: #008000;">&amp;&amp;</span> <span style="color: #FF0000;">8</span> <span style="color: #008000;">&gt;</span> d <span style="color: #008000;">||</span> c <span style="color: #008000;">==</span> d<span style="color: #008000;">;</span>
Expression<span style="color: #008000;">&lt;</span>Func<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">bool</span><span style="color: #008000;">&gt;&gt;</span> e4 <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> b <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">4</span><span style="color: #008000;">;</span>
Expression<span style="color: #008000;">&lt;</span>Func<span style="color: #008000;">&lt;</span>RecordName, <span style="color: #FF0000;">bool</span><span style="color: #008000;">&gt;&gt;</span> e5 <span style="color: #008000;">=</span> rn <span style="color: #008000;">=&gt;</span> rn.<span style="color: #0000FF;">LastName</span> <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;ALFKI&quot;</span><span style="color: #008000;">;</span>
Expression<span style="color: #008000;">&lt;</span>Func<span style="color: #008000;">&lt;</span>StringBuilder<span style="color: #008000;">&gt;&gt;</span> e6 <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> <span style="color: #008000;">new</span> StringBuilder <span style="color: #000000;">&#123;</span> Capacity <span style="color: #008000;">=</span> <span style="color: #FF0000;">20</span> <span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
Expression<span style="color: #008000;">&lt;</span>Func<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span>, <span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;&gt;</span> e7 <span style="color: #008000;">=</span> word <span style="color: #008000;">=&gt;</span> word <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;hello&quot;</span> <span style="color: #008000;">?</span> <span style="color: #666666;">&quot;yes&quot;</span> <span style="color: #008000;">:</span> <span style="color: #666666;">&quot;no&quot;</span><span style="color: #008000;">;</span>
&nbsp;
&nbsp;
<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>var item <span style="color: #0600FF;">in</span> <span style="color: #008000;">new</span> Expression<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> e1, e2, e3, e4, e5, e6,e7 <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>item.<span style="color: #0000FF;">GetCodeDomSource</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;vb&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Visual Basic Output</p>

<div class="wp_syntax"><div class="code"><pre class="vb" style="font-family:monospace;">Namespace Runtime
&nbsp;
    <span style="color: #000080;">Public</span> Class LambdaExpression
&nbsp;
        <span style="color: #000080;">Private</span> LastName <span style="color: #000080;">As</span> <span style="color: #000080;">String</span>
&nbsp;
        <span style="color: #000080;">Private</span> <span style="color: #000080;">Sub</span> <span style="color: #000080;">New</span>()
            MyBase.<span style="color: #000080;">New</span>
            Me.Func`2
        <span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span>
&nbsp;
        <span style="color: #000080;">Private</span> <span style="color: #000080;">Function</span> Func`2(<span style="color: #000080;">ByVal</span> rn <span style="color: #000080;">As</span> Demo.Program.RecordName) <span style="color: #000080;">As</span> <span style="color: #000080;">Boolean</span>
            Return (LastName <span style="color: #000080;">Is</span> <span style="color: #800000;">&quot;ALFKI&quot;</span>)
        <span style="color: #000080;">End</span> <span style="color: #000080;">Function</span>
    <span style="color: #000080;">End</span> Class
<span style="color: #000080;">End</span> Namespace</pre></div></div>

<p>C# Output</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">namespace</span> Runtime <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
&nbsp;
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> LambdaExpression <span style="color: #000000;">&#123;</span>
&nbsp;
        <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">string</span> LastName<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">private</span> LambdaExpression<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Func</span>`<span style="color: #FF0000;">2</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">bool</span> Func`<span style="color: #FF0000;">2</span><span style="color: #000000;">&#40;</span>Demo.<span style="color: #0000FF;">Program</span>.<span style="color: #0000FF;">RecordName</span> rn<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>LastName <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;ALFKI&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

</p>
<h1>Conclusion</h1>
<p>Codedom is too much C# centric, so it&#8217;s hard to make it available for every language. The difference between Code Statement  and Code Expressions  sometimes  makes it hard to convert from expression trees.  </p>
<p>
On the on the other hand Expression trees are too much LINQ oriented. They are less powerful than CodeDom but more easy to express. In expression trees everything is an expression unlike CodeDom. Some constructs are missing from expression trees like the assignment, but we will probably see the improvements in the expression trees in the future. So it might not be a true DSL or language generator, but sure it is enough to get the most of the databases. </p>
<p>There are some other more powerful meta-programming tools and libraries. F# quotation library supports all the available  full-set language features expressed as quotations. Dynamic Language Runtime is another expression tree like library focussed more on compiler developers. </p>
<p>
Finally this library is not build for runtime code conversion from expression tree to CodeDom, although it is possible. The CodeDom generated code is mainly for debugging to print the source code of the query. It might also be helpful for seeing what is going on under the hood.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codingday.com/meta-programming-with-expression-trees-lambdas-to-codedom-conversion/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Astoria as a Database Service</title>
		<link>http://www.codingday.com/astoria-as-a-database-service/</link>
		<comments>http://www.codingday.com/astoria-as-a-database-service/#comments</comments>
		<pubDate>Tue, 07 Aug 2007 01:57:30 +0000</pubDate>
		<dc:creator>Can</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[100mb]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[astoria]]></category>
		<category><![CDATA[database_service]]></category>
		<category><![CDATA[entity_relationship]]></category>
		<category><![CDATA[linq]]></category>
		<category><![CDATA[orcas]]></category>
		<category><![CDATA[relational_database]]></category>
		<category><![CDATA[s3_web]]></category>
		<category><![CDATA[web_service]]></category>

		<guid isPermaLink="false">http://www.canerten.com/astoria-as-a-database-service/</guid>
		<description><![CDATA[It&#8217;s getting even more interesting. With the efforts of LINQ to be the solution for entity relationship now Microsoft adds additional features with Astoria services. Although it looks like an independent product, it has a dependency with ADO.Net Entity Framework (System.Data.Entity) which is not included in ORCAS Beta 2 and also not available for beta [...]]]></description>
			<content:encoded><![CDATA[<p style="background: white"><span style="font-family:Arial; font-size:9pt">It&#8217;s getting even more interesting. With the efforts of LINQ to be the solution for entity relationship now Microsoft adds additional features with <a href="http://astoria.mslivelabs.com/">Astoria</a> services. Although it looks like an independent product, it has a dependency with ADO.Net Entity Framework (System.Data.Entity) which is <a href="http://blogs.msdn.com/adonet/archive/2007/08/03/entity-framework-beta-2.aspx">not included in ORCAS Beta 2</a> and also not available for beta 2. So I couldn&#8217;t play with it.<br />
</span></p>
<p style="background: white"><span style="font-family:Arial; font-size:9pt">Astoria as <a href="http://blogs.msdn.com/brada/archive/2007/08/05/create-your-own-100mb-of-astoria-data.aspx">announced</a> is a database service that supports different protocols and standards. At first it looks like <a href="http://www.amazon.com/gp/browse.html?node=16427261">Amazon S3</a> web service, but you can also host it yourself. Why would you want to host it? I don&#8217;t think this model would be useful for .NET applications, although you can, why to use another layer. Presumably it&#8217;s for Javascript and Silverlight usage mainly, you don&#8217;t need any additional libraries, it&#8217;s all there as a REST web service. Currently 100MB is provided by Astoria site&#8230;<br />
</span></p>
<p style="background: white"><span style="font-family:Arial; font-size:9pt">I wonder if the web is going to provide enterprise services sooner or later.  Although we store all our e-mail, calendar in the web, I still use my hosting database server or local cache rather than web services. Anyway I like the web relational database idea&#8230; I hope to play in the next release.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.codingday.com/astoria-as-a-database-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software Agent Systems and their Applications &#8211; message based parallel programming (Erlang style)</title>
		<link>http://www.codingday.com/software-agent-systems-and-their-applications/</link>
		<comments>http://www.codingday.com/software-agent-systems-and-their-applications/#comments</comments>
		<pubDate>Fri, 15 Jun 2007 23:24:45 +0000</pubDate>
		<dc:creator>Can</dc:creator>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Articles]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[human_computer_interaction]]></category>
		<category><![CDATA[intelligent_agents]]></category>
		<category><![CDATA[research_papers]]></category>
		<category><![CDATA[software_agents]]></category>
		<category><![CDATA[software_agent_systems]]></category>

		<guid isPermaLink="false">http://www.canerten.com/software-agent-systems-and-their-applications/</guid>
		<description><![CDATA[Introduction Software agent is a program that handles the behaviour of a user or software with the aid of an agency. The software agents are not called by a user or by a process, they are acting themselves, they decide the next task to do. This drives the system to the concept of intelligent agents. [...]]]></description>
			<content:encoded><![CDATA[<h1>Introduction<br />
</h1>
<p>Software agent is a program that handles the behaviour of a user or software with the aid of an agency. The software agents are not called by a user or by a process, they are acting themselves, they decide the next task to do. This drives the system to the concept of intelligent agents.
</p>
<p>Agent system is a system composed of several software agents. It provides the collective environment for making the goals possible for individual agent. It helps the agents to communicate and delegate the task. Although software agents are considered as autonomous, all agents operate on a human supervision.
</p>
<p>For agent systems, there are no currently implemented commercial applications; however there are a lot of ongoing research projects in the software agents and agent systems area. I have read a couple of research papers in software agent systems and software agents. One of the research papers is focussing on the different architectures behind the software agent systems. The other research paper is about different implications of the software agents for different scenarios.
</p>
<p>Software agents and agent systems will be the key elements in information technology. They will solve many problems of information overload and this will change the human computer interaction. It will also change the way we develop software for large systems.
</p>
<p>It is possible to use modern agent platforms to implement large scale agent systems. They are some working applications of software agents in an e-commerce system and software agents as a resource broker in the grid.  I will try to investigate on different types of software agents and their implications.
</p>
<p>There are different types of agent systems. Intelligent agents are capable of modifying their behaviour based on their learning and reasoning. Distributed agents are executed physically in distinct machines. Multi-agent systems are basically distributed agents that are not capable of doing alone the objective. They need to talk and communicate. Mobile agents are the agents that can execute on different processors.
</p>
<h1>Software Agents and Agent Systems<br />
</h1>
<p>In real life, agents are expert people on some areas. For example a travel agent has the information needed for you to travel. They have the information and they have the connections to make the travel for us. Another example is the insurance agent, they have a deep knowledge in their fields and they provide this information for us.
</p>
<p>These are the characteristics of software agents as well. They are specialised and provide only the needed knowledge. It is possible to find, filter or customise the interaction with software agents.  Software agents will affect relatively the software evolution. We have some technologies used in software development like object orientation, and multi-threaded objects. The main concept is the execution in threads and communication between threads. Next thing will be the software agents. The agent based approach will be the revolution for building complex software systems.  They are some implications of software agents. For instance Bio-agents work on a cellular automaton. They have a simple behaviour and they don&#8217;t have any intelligence.
</p>
<p>Software agents are designed with dynamic transportations. In dynamic transportation the parts are changing, the environment does not build thousand parts. It works with real-time scheduling and it chooses the best scenario based on the real-life conditions.
</p>
<p>A tool called JADE can be used as a software agent system. In JADE, agents communicate with messages. They send and receive ACL messages. JADE also provides queue for the agents.
</p>
<p>Some real world examples exist for software agents. Agents can operate in an e-shop application. They can go to e-shop; buy some things and can kill themselves can be a simple usage of the software agents. There exist also agent systems for large distributed area like GRID systems. Agents can travel in the grid for resource broking.
</p>
<p>There are some assumptions of the agents in the grid. The agents work in teams, and each agent has a team leader. Incoming agents can join any team based on the criteria they have been created.  Teams can accept or reject the incoming agents based on their criteria of acceptance. There exists different type of architectures.  One of the approaches is the usage of thread pool. Task-per-thread paradigm is being used in that architecture.  Another approach is the use of databases. Database agents are located on remote machines contributing additional computational power.
</p>
<p>Developing high-quality industry ready is difficult to achieve.  It is one of the complex construction tasks to build software in telecommunication or other big industrial areas because of the size of the data and because of the rules to implement.
</p>
<p>I think complex software systems can be built and designed by the use of autonomous agents. It can give some advantages to the software engineers especially for some areas. GRID computing is the most complex system that can be handled with software agents.
</p>
<p>Computers are becoming more important for everyday activities of every business and every people. The speed of access to the information is less than seconds and the information is increasing exponentionally every single hour. Current software implementations are enough to handle that huge request for the moment; however without an autonomous system this task is getting harder to accomplish with the technological developments. The human driven mechanism for handling the information will collapse soon or later. This metaphor has to change from the software systems perspective. Software agents can help in organising the data without human interaction and make the data ready for people&#8217;s use.
</p>
<h1>Conclusion<br />
</h1>
<p>Agent-oriented techniques are used in many big areas. There are some experiments on the GRID computing which makes this work very important. GRID computing is very important especially in the research area. However it will be more relevant for the industry as well.
</p>
<p>JADE is one of the great multi-agent development tools that support different architectures. None of the architectures can be good for a particular solution. Each problem has different situations and each might have a different architecture.  As the research and development continues in that area, every problem will be investigated and will have a particular solution.
</p>
<p>Software agents can be applied to many different areas. Software engineers will accept the agent-based approach soon or later to make their system autonomous and intelligent.  We might see a combination of paradigms in the future. Agent-oriented concepts and techniques are well suited to developing complex and distributed systems as an extension to the current paradigms.<span style="color:black; font-family:Arial; font-size:12pt"><br />
		</span></p>
<p>Software engineering started to be like a car manufacturing company. Many things are getting automated and many software paradigms are becoming de facto standard for a particular problem. It is sometimes make the process easier; on the other hand it makes difficult to implement for some scenarios. <span style="color:black; font-family:Times New Roman; font-size:11pt"><br />
		</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.codingday.com/software-agent-systems-and-their-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
