Ok so I&#39;m wondering if I&#39;m perhaps using the wrong words to try to say what I mean. Because when I look into the IronPython source code I see a class called Microsoft.Scripting.Generation.TypeGen (<a href="http://ironpython.codeplex.com/SourceControl/changeset/view/65328#1011039">http://ironpython.codeplex.com/SourceControl/changeset/view/65328#1011039</a>). Which appears to be code for generating a .net type contrary to your response. Am I misinterpreting that?<div>
<br></div><div>Thanks for your examples below but that is about as far as I have gotten already, what I need is a way to actually generate types and instances members. And I was just looking at the ILGen class and all it&#39;s interesting helpers but what I&#39;d really love to find is a way to generate this by just giving it an AST (including &quot;this&quot; references) instead of having to mess around with IL (hasn&#39;t this been solved already??).</div>
<div><br></div><div>I know that Python has a &quot;class&quot; construct and that if I compile scripts I can create instances of these objects, does this translate into actual .net types under the hood? Or something else? Can you add attributes or annotations to these classes for example? For my grand finale what I would really like to do is to generate types that implement interfaces and load them via MEF (by means of the Export attribute). Is this just the wrong way to be thinking about this entirely? Or am I just missing something?</div>
<div><br></div><div><br><div class="gmail_quote">On Mon, Apr 12, 2010 at 3:33 PM, Dino Viehland <span dir="ltr">&lt;<a href="mailto:dinov@microsoft.com">dinov@microsoft.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">









<div lang="EN-US" link="blue" vlink="purple">

<div>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">Nope – the DLR doesn’t have any support for building .NET types –
dynamic or otherwise.  If you’d like to just build an object which behaves
dynamically I’d suggest looking at DynamicObject.  You can just subclass it and
override various Try* methods and you’ll have a dynamic object.</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">If you really do need to do ILGen into a type, and as long as
you’re building only static methods, you can use expression trees via
Lambda&lt;T&gt;.CompileToMethod (unfortunately currently instance methods are
not supported).  Here’s an example of that:</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">using System;</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">using System.Linq.Expressions;</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">using System.Reflection;</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">class Foo {</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">    public static void Main(string[] args) {</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">        var asm =
AppDomain.CurrentDomain.DefineDynamicAssembly(new
AssemblyName(&quot;foo&quot;),
System.Reflection.Emit.AssemblyBuilderAccess.Save);</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">        var module =
asm.DefineDynamicModule(&quot;foo.dll&quot;);</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">        var type = module.DefineType(&quot;TestType&quot;);</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">        var param1 = Expression.Parameter(typeof(Foox),
&quot;arg1&quot;);</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">        var param2 = Expression.Parameter(typeof(Foox),
&quot;arg2&quot;);</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">        var method = type.DefineMethod(&quot;TestMethod&quot;,
MethodAttributes.Public | MethodAttributes.Static);</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">        Expression.Lambda&lt;Func&lt;Foox, Foox, bool&gt;&gt;(</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">            Expression.Equal(param1, param2),</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">            new[] { param1, param2 }</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">        ).CompileToMethod(method);</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">        type.CreateType();</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">        asm.Save(&quot;foo.dll&quot;);</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">    }</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">}</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">enum Foox {</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">    Bar,</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">    Baz</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">}</span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">

<div>

<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">

<p class="MsoNormal"><b><span style="font-size:10.0pt">From:</span></b><span style="font-size:10.0pt"> <a href="mailto:users-bounces@lists.ironpython.com" target="_blank">users-bounces@lists.ironpython.com</a>
[mailto:<a href="mailto:users-bounces@lists.ironpython.com" target="_blank">users-bounces@lists.ironpython.com</a>] <b>On Behalf Of </b>Justin Chase<br>
<b>Sent:</b> Monday, April 12, 2010 1:21 PM<br>
<b>To:</b> <a href="mailto:users@lists.ironpython.com" target="_blank">users@lists.ironpython.com</a><br>
<b>Subject:</b> [IronPython] Building via AST</span></p>

</div>

</div><div><div></div><div class="h5">

<p class="MsoNormal"> </p>

<p class="MsoNormal">Suppose I would like to build an AST programmatically and
compile that into an assembly dynamically (meaning an assembly flagged with
RunAndCollect) from C#. How would I do that with IronPython&#39;s help? I do not
what to author Python code and compile that I would like to just deal directly
with the AST. </p>

<div>

<p class="MsoNormal"> </p>

</div>

<div>

<p class="MsoNormal">Currently I have working code where I&#39;m using
System.Linq.Expression namespace to build statements and expressions into
delegates but what I would like is to leverage the DLR to build dynamic types
as well (without having to use ILGenerator preferably). Is this possible today?</p>

</div>

<div>

<p class="MsoNormal"><br>
-- <br>
Justin Chase <br>
<a href="http://www.justnbusiness.com" target="_blank">http://www.justnbusiness.com</a></p>

</div>

</div></div></div>

</div>

</div>


<br>_______________________________________________<br>
Users mailing list<br>
<a href="mailto:Users@lists.ironpython.com">Users@lists.ironpython.com</a><br>
<a href="http://lists.ironpython.com/listinfo.cgi/users-ironpython.com" target="_blank">http://lists.ironpython.com/listinfo.cgi/users-ironpython.com</a><br>
<br></blockquote></div><br><br clear="all"><br>-- <br>Justin Chase <br><a href="http://www.justnbusiness.com">http://www.justnbusiness.com</a><br>
</div>