<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET Framework</title><link>https://www.dotnetzone.gr:443/cs/forums/14/ShowForum.aspx</link><description>Θέματα για threading, remoting, reflection, exception handling, security, regex κλπ.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Expression Trees</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67174.aspx</link><pubDate>Fri, 09 Sep 2011 22:55:55 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67174</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67174.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67174</wfw:commentRss><description>&lt;p&gt;Να προσθέσω ότι τα Expression Trees σε μεγάλο βαθμό ΕΙΝΑΙ για το LINQ αλλά δεν είναι δεμένα με αυτό (πέρα από το namespace). Είναι τόσο γενικά που μπορούν να χρησιμοποιηθούν σε άπειρες άλλες περιπτώσεις (μου ήρθε το πρωί: triggers και actions σε state machines).&lt;/p&gt;&lt;p&gt;Από την άλλη, δεν φτιάχτηκαν για δυναμικό προγραμματισμό. Για το σκοπό αυτό υπάρχει το DLR το οποίο σου δίνει τις δυναμικές δυνατότητες που σου παρέσει η LISP και η Ruby. Υπάρχει επίσης και η F# η οποία είναι μία πλήρως functional γλώσσα αν θέλεις τις functional λειτουργίες της LISP. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>Απ: Expression Trees</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67172.aspx</link><pubDate>Fri, 09 Sep 2011 22:31:26 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67172</guid><dc:creator>dimos.homatas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67172.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67172</wfw:commentRss><description>Σας ευχαριστώ όλους για το input σας.</description></item><item><title>Απ: Expression Trees</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67142.aspx</link><pubDate>Fri, 09 Sep 2011 06:27:32 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67142</guid><dc:creator>Libra Storm</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67142.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67142</wfw:commentRss><description>&lt;p&gt;Εγώ τα είχα βρει πολύ χρήσιμα όταν ήθελα να φτιάξω κώδικα δυναμικά όταν έτρεχε η εφαρμογή χωρίς να μπλέξω με IL. Δεν γνωρίζω αν υπάρχει κάποιος καλύτερος τρόπος τώρα, αλλά τουλάχιστον η σύνταξη των expression trees μου φάνηκε πιό εύκολη. Αν&amp;nbsp;έχουν φτιαχτεί μόνο γιά LINQ τότε λάθος μου ...&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table border="0" cellSpacing="0" cellPadding="0" width="100%"&gt;&lt;tr style="line-height:normal;vertical-align:top;"&gt;&lt;td style="width:40px;text-align:right;"&gt;&lt;pre style="margin:0px;padding:2px;color:gray;font-family:courier new;font-size:11px;border-right-width:1px;border-right-style:solid;"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 &lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre style="margin:0px;padding:2px 2px 2px 8px;"&gt;&lt;span style="color:black;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Option&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Strict&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;On&lt;/span&gt;
&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Imports&lt;/span&gt; System.Reflection.Emit
&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Imports&lt;/span&gt; System.Linq.Expressions

&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Class&lt;/span&gt; Form1
    &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Delegate&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Function&lt;/span&gt; SquareDelegate(Of Result, Parameter)(&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;ByVal&lt;/span&gt; p &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;As&lt;/span&gt; Parameter) &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;As&lt;/span&gt; Result

    &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Sub&lt;/span&gt; cmdIL_Click(&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;As&lt;/span&gt; System.&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Object&lt;/span&gt;, &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;ByVal&lt;/span&gt; e &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;As&lt;/span&gt; System.EventArgs) _
    &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Handles&lt;/span&gt; cmdIL.Click
        &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Dim&lt;/span&gt; args &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;As&lt;/span&gt; Type() &lt;span style="color:red;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;=&lt;/span&gt; {&lt;span style="color:red;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;GetType&lt;/span&gt;(&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Integer&lt;/span&gt;)}
        &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Dim&lt;/span&gt; Square &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;As&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;New&lt;/span&gt; DynamicMethod(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Square"&lt;/span&gt;, &lt;span style="color:red;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;GetType&lt;/span&gt;(&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Long&lt;/span&gt;), args)
        &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Dim&lt;/span&gt; il &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;As&lt;/span&gt; ILGenerator &lt;span style="color:red;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;=&lt;/span&gt; Square.GetILGenerator

        il.Emit(OpCodes.Ldarg_0)    &lt;span style="color:green;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;' Βάλτο στο stack&lt;/span&gt;
        il.Emit(OpCodes.Conv_I8)    &lt;span style="color:green;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;' cast σε long&lt;/span&gt;
        il.Emit(OpCodes.Dup)        &lt;span style="color:green;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;' Push το ίδιο argument στο stack&lt;/span&gt;
        il.Emit(OpCodes.Mul)        &lt;span style="color:green;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;' multiply&lt;/span&gt;
        il.Emit(OpCodes.Ret)        &lt;span style="color:green;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;' Return με κάποια τιμή (αν υπάρχει)&lt;/span&gt;

        &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Dim&lt;/span&gt; invokeSquare &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;As&lt;/span&gt; SquareDelegate(Of &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Long&lt;/span&gt;, &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Integer&lt;/span&gt;) &lt;span style="color:red;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;=&lt;/span&gt;
            &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;CType&lt;/span&gt;(Square.CreateDelegate(&lt;span style="color:red;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;GetType&lt;/span&gt;(SquareDelegate(Of &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Long&lt;/span&gt;, &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Integer&lt;/span&gt;))), SquareDelegate(Of &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Long&lt;/span&gt;, &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Integer&lt;/span&gt;))

        Console.WriteLine(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"5 * 5 = {0}"&lt;/span&gt;, invokeSquare(5))
    &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;End&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Sub&lt;/span&gt;

    &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Sub&lt;/span&gt; cmdTree_Click(&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;As&lt;/span&gt; System.&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Object&lt;/span&gt;, &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;ByVal&lt;/span&gt; e &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;As&lt;/span&gt; System.EventArgs) _
    &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Handles&lt;/span&gt; cmdTree.Click
        &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Dim&lt;/span&gt; param &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;As&lt;/span&gt; ParameterExpression &lt;span style="color:red;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;=&lt;/span&gt; Expression.Parameter(&lt;span style="color:red;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;GetType&lt;/span&gt;(&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Integer&lt;/span&gt;), &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"param"&lt;/span&gt;)
        &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Dim&lt;/span&gt; Square &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;As&lt;/span&gt; Expression &lt;span style="color:red;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;=&lt;/span&gt; Expression.Convert(Expression.Multiply(param, param), &lt;span style="color:red;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;GetType&lt;/span&gt;(&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Long&lt;/span&gt;))

        Console.WriteLine(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"5 * 5  = {0}"&lt;/span&gt;, Expression.Lambda(Of Func(Of &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Integer&lt;/span&gt;, &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Long&lt;/span&gt;))(Square, param).Compile()(5))
    &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;End&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Sub&lt;/span&gt;
&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;End&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description></item><item><title>Απ: Expression Trees</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67135.aspx</link><pubDate>Thu, 08 Sep 2011 23:42:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67135</guid><dc:creator>dimos.homatas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67135.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67135</wfw:commentRss><description>&lt;div&gt;Δεν έχω κάποιο συγκεκριμένο λόγο ακόμα - και ο λόγος είναι η πρώτη ερώτηση! Αν ήξερα που μπορώ να τα χρησιμοποιήσω, ίσως και να τα χρησιμοποιούσα!&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Τα ανακάλυψα σχετικά πρόσφατα από τον δρόμο delegates -&amp;gt; anonymous methods -&amp;gt; lambda expressions -&amp;gt; action &amp;amp; func.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Γενικότερα έψαχνα (μέσω LINQ) να βρω πως γίνονται κάποια πράγματα που τα έχω δει στην Lisp (εντελώς χομπιστικά), πχ να εφαρμόζω κάποιο method επιλεκτικά πάνω σε ένα collection από objects.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Ε, ψάχνοντας μου έκανε κλικ το concept του expression tree, και πιάστηκα από το ότι έχουμε κώδικα σε ένα object κλπ. Επίσης, ξαναθυμούμενος την Lisp, όπου ο κώδικας ο ίδιος αποτελείται από τις ίδιες δομές που αποτελούνται και τα data, είπα να κοιτάξω και το αντίστοιχο concept στο .ΝΕΤ, με αποτέλεσμα τον τοίχο αυτόν.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Αυτό που σκέφτομαι πάντως, είναι ότι εάν θα μπορούσα να έχω serializable expression trees (από .ΝΕΤ 4 για τους λόγους που προανέφερα, loops, branching etc), μία πρακτική εφαρμογή θα ήταν να έχω τον κώδικα (ή κάποια components) αποθηκευμένο σε μία βάση με αποτέλεσμα, εάν θέλω να κάνω κάποιο update, απλά να αλλάζω τα δεδομένα στην βάση και να μην μπαίνω στην διαδικασία της αποστολής των εκτελέσιμων/update κλπ&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Τώρα που το σκέφτομαι, μήπως καλύπτομαι από τα action/func;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;</description></item><item><title>Απ: Expression Trees</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67133.aspx</link><pubDate>Thu, 08 Sep 2011 22:24:48 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67133</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67133.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67133</wfw:commentRss><description>&lt;p&gt;Λοιπόν, ψάχνοντας για expression tree serialization έπεσα σε αυτή την παρόμοια&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/3efab46d-1023-48c9-b292-f9a76c41fd94/"&gt; ερώτηση στα MSDN Forums&lt;/a&gt;, όπου κάποιος χρησιμοποιεί το MetaLINQ (κάτι σαν Linq to BLOCKED EXPRESSION για να δημιουργήσει XML . To MetaLINQ όμως έχει 2 χρόνια να ανανεωθεί και δεν υποστηρίζει recursion. Έπεσα και στο &lt;a href="http://expressiontree.codeplex.com/"&gt;Expression Tree Serializer&lt;/a&gt; το οποίο φαίνεται να είναι ένα rewrite σε .NET 4.0 &amp;nbsp;του serializer που είχε μπει στο MSDN Code. &lt;/p&gt;&lt;p&gt;Ως τώρα έχω βρει δύο περιπτώσεις όπου χρειάζεται το expression serialization: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;Να γράψεις ένα LINQ query στον client και να το εκτελέσεις στο server (όπως στα WCF RIA Services του Silverlight) &lt;/li&gt;&lt;li&gt;&lt;a href="http://marcinbudny.blogspot.com/2008/11/using-metalinq-to-simulate-nhbernates.html"&gt;Να δημιουργήσεις criteria &lt;/a&gt;που αφορούν π.χ. ένα EF query χωρίς να έχεις φορτώσει το αντίστοιχο context. Είναι το αντίστοιχο των DetachedCriteria του NHibernate, το οποίο είναι serializable. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Εσύ τί προσπαθείς να κάνεις?&lt;/p&gt;</description></item><item><title>Απ: Expression Trees</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67131.aspx</link><pubDate>Thu, 08 Sep 2011 21:55:33 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67131</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67131.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67131</wfw:commentRss><description>&lt;p&gt;Αυτό είναι άλλη ερώτηση. Ξέρεις τί να κάνεις το expression tree, έχεις ένα έτοιμο και θέλεις για κάποιο λόγο να το αποθηκεύσεις ή να το στείλεις σε άλλο κώδικα. (Αλήθεια, γιατί?)&lt;/p&gt;&lt;p&gt;Το serialization δεν απαιτεί τα αντικείμενα που αποθηκεύεις να έχουν το Serializable attribute. Αν το έχουν, μπορείς να χρησιμοποιήσεις τους built-in serializers του .NET για δημιουργήσεις την ενδιάμεση μορφή κειμένου ή binary και το αντίστροφο. Επειδή όμως αυτή η μορφή είναι αρκετά φλύαρη, ένας custom serializer θα δημιουργήσει πολύ μικρότερο string/binary και μπορεί να είναι και αρκετά γρηγορότερος. Αν μάλιστα πρέπει να χρησιμοποιήσεις κάποιο συγκεκριμμένο format, o custom serializer είναι απαραίτητος.&lt;/p&gt;&lt;p&gt;Αλήθεια, τί προσπαθείς να κάνεις? Αφού ήδη έχεις βρει κάποιο Expression tree serializer. Στην αρχική σου ερώτηση λες ότι δεν μπορεί να κάνει serialize procedures. Δηλαδή? Θέλεις να κάνει serialize την κλήση σε κάποιο άγνωστο procedure ή περιμένεις να κάνει serialize τον κώδικα του stored procedure?&lt;/p&gt;&lt;p&gt;Άν σκεφτείς πάντως ότι τα expression trees είναι το ενδιάμεσο αποτέλεσμα parsing κάποιας γλώσσας, προτιμότερο είναι να αποθηκεύσεις αυτή την αρχική μορφή παρά το expression tree. Σχεδόν πάντα (εκτός και αν μιλάμε για XML) η αρχική μορφή είναι πολύ μικρότερη από το expression tree. Δεν έχει μεγάλο νόημα να κάνεις serialize την ενδιάμεση μορφή όταν υπάρχει διαθέσιμη η αρχική.&lt;/p&gt;</description></item><item><title>Απ: Expression Trees</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67129.aspx</link><pubDate>Thu, 08 Sep 2011 21:10:54 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67129</guid><dc:creator>dimos.homatas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67129.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67129</wfw:commentRss><description>Οκ, κατανοητό. Αλλά δεν μπορώ να κάνω serialize ένα expression tree, λέει ότι δεν είναι serializable.&amp;nbsp;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Οπότε, και μιας και με ενδιαφέρει περισσότερο το concept της αποθήκευσης δημιουργημένου κώδικα από κώδικα, επεκτείνω το ερώτημα: πως μπορώ να έχω persistent storage (οποιασδήποτε μορφής) ενός expression tree;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Την ερώτηση την έκανα αρχικά γιατί από όσο είδα, δεν μπορούσα να τα αποθηκεύσω - τόσο με binary serializer όσο και με την βιβλιοθήκη που προανέφερα.&lt;/div&gt;</description></item><item><title>Απ: Expression Trees</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67120.aspx</link><pubDate>Thu, 08 Sep 2011 19:12:19 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67120</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67120.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67120</wfw:commentRss><description>&lt;p&gt;Λάθος. Τα expression trees χρησιμεύουν σε πολύ περισσότερα πράγματα από LINQ providers. Όσο για το&amp;nbsp;serialization ... δεν χρησιμοποιούνται τα expression trees για serialization αλλά το αντίστροφο: αν θέλεις να στείλεις ένα expression tree από ένα process σε ένα άλλο, μπορείς να χρησιμοποιήσεις ΚΑΙ .NET serialization. Ή να μετατρέψεις το expression tree σε ένα κοινό string format (π.χ. SQL, FORTRAN, καντονέζικα) και να στείλεις αυτή τη μορφή. &lt;/p&gt;&lt;p&gt;Τα expression trees σχετίζονται άμεσα με το parsing. To expression tree είναι η δομή που δημιουργείται όταν γίνεται parse ένα expression είτε είναι LINQ είτε αριθμητική πράξη. Αυτή τη δομή μετά την επεξεργάζεται το σύστημα ή ο δικός σου κώδικας για να κάνει "κάτι". Αυτό μπορεί να είναι να δημιουργήσει SQL statements και&amp;nbsp;Sharepoint CAML queries, ή να εκτελέσει κώδικα για κάθε διαφορετικό statement και operator που θα βρει. Επιπλέον, μπορείς να κάνεις compile ένα expression tree και να εκτελέσεις τον κώδικα που αντιπροσωπεύει.&lt;/p&gt;&lt;p&gt;Για παράδειγμα, το DLR δημιουργεί expression trees για να εκτελέσει τον κώδικα που του δίνεις σε μία δυναμική γλώσσα στο runtime. Ή μπορείς εσύ να φτιάξεις ένα mini parser που θα παίρνει π.χ. φόρμουλες που δίνει ο χρήστης (σε στυλ Excel) και θα τις μετατρέπει σε expression tree για εκτέλεση.&amp;nbsp; Αν θέλεις να φτιάξεις δυναμικά ένα LINQ Query θα πρέπει να φτιάξεις το αντίστοιχο LINQ expression tree με κώδικα. &lt;/p&gt;&lt;p&gt;Τα expression trees και τα lambdas συνδέονται γιατί στο .ΝΕΤ μπορείς άνετα να περάσεις ένα lambda είτε ως function, είτε ως expression χωρίς να αλλάξεις τον κώδικα σου. Αυτό επιτρέπει κάποιες πολύ ενδιαφέρουσες τεχνικές. &lt;/p&gt;&lt;p&gt;&amp;nbsp;Για παράδειγμα,&amp;nbsp;στο Silverlight και το&amp;nbsp;WPF (και όχι μόνο)&amp;nbsp;σηκώνεις το PropertyChanged event για να ειδοποιήσεις ότι κάποιο property άλλαξε. Το event δέχεται ως παράμετρο ένα string και προφανώς, αν αλλάξεις όνομα στο property χωρίς να αλλάξεις και το string, την πάτησες. Ένας τρόπος να αποφύγεις το πρόβλημα είναι να ορίσεις είναι ένα function του στυλ RaisePropertyChanged(()=&amp;gt;MyPropertyName). Αν η RaisePropertyChanged οριστεί ως RaisePropertyChanged&amp;lt;T&amp;gt;(Funct&amp;lt;T&amp;gt; param1), το param1 είναι ένα function που θα σου γυρίσει την τιμή του property. Άν όμως οριστεί ως Expression&amp;lt;Func&amp;lt;T&amp;gt;&amp;gt;, είναι ένα expression tree το οποίο περιέχει το function. Από αυτό το expression μετά μπορώ να τραβήξω το όνομα του property. Αν τώρα κάποιος αλλάξει το όνομα του property χωρίς να αλλάξει και την κλήση του RaisePropertyChanged, ο compiler θα χτυπήσει και θα σε ειδοποιήσει.&lt;/p&gt;&lt;p&gt;Την παρακάτω (απλοποιημένη) υλοποίηση την έχω αντιγράψει από το Caliburn.Micro&lt;/p&gt;&lt;pre&gt;&lt;span style="color:black;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;&lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;public&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;virtual&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;void&lt;/span&gt; NotifyOfPropertyChange&amp;lt;TProperty&amp;gt;(Expression&amp;lt;Func&amp;lt;TProperty&amp;gt;&amp;gt; property) {
     RaisePropertyChanged(property.GetMemberInfo().Name);
}&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;και καλείται άνετα ως NotifyOfPropertyChange(()=&amp;gt;MyProperty); &lt;/p&gt;&lt;p&gt;Σε &lt;a href="http://www.dotnetzone.gr/cs/forums/thread/66872.aspx"&gt;αυτή τη συζήτηση&lt;/a&gt; θα βρεις και άλλη μία παρόμοια χρήση. Το client&amp;nbsp;library του Sharepoint&amp;nbsp;απαιτεί να του δώσεις με τον ίδιο τρόπο lambdas με τα ονόματα των πεδίων που θέλεις να φορτώσεις. Χωρίς να έχω ψάξει σε βάθος τον κώδικα του Sharepoint, υποθέτω ότι θα μπορούσαν να στείλουν το expression tree στον server για να μετατρέψουν το DataTable που σου&amp;nbsp; επιστρέφει ο server στο OData stream που περιμένει ο client.&lt;/p&gt;&lt;p&gt;Τα expression trees επιτρέπουν επίσης το metaprogramming: Να δώσεις τη δυνατότητα στο πρόγραμμα σου να φτιάχνει το ίδιο τον κώδικα που πρέπει να εκτελέσει. Για παράδειγμα, αν έχεις μία περίπλοκη διαδικασία της οποίας τα βήματα εξαρτώνται από τα στοιχεία που δίνει ο χρήστης, μπορείς να τη σπάσεις σε απλά βήματα και να δομήσεις το expression tree της συνολικής διαδικασίας με βάση τα στοιχεία του χρήστη. &lt;/p&gt;&lt;p&gt;Ένα παράδειγμα metaprogramming θα ήταν π.χ. σε ένα GIS σύστημα&amp;nbsp;ή σε ένα παιχνίδι, να ορίσεις τις ενέργεις που θα πρέπει να γίνουν αν μετακινήσεις ένα αντικείμενο από το σημείο Α στο Β ανάλογα με τις συνθήκες: υπάρχει δρόμος, έχουμε βενζίνη ή ενέργεια, ειδοποιώ άλλα συστήματα για τη μετακίνηση? Μπορείς μάλιστα να δεις τα LINQ statements ως μία πολύ απλή μορφή metaprogramming, καθώς τα&amp;nbsp;Where, Select κλπ&amp;nbsp;δημιουργούν βήμα - βήμα τον κώδικα που θα εκτελεστεί στο τέλος όταν καλέσεις την ToList().&amp;nbsp;&lt;/p&gt;</description></item><item><title>Απ: Expression Trees</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67119.aspx</link><pubDate>Thu, 08 Sep 2011 16:20:31 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67119</guid><dc:creator>dimos.homatas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67119.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67119</wfw:commentRss><description>Ευχαριστώ για την απάντηση, έχει πάρει το μάτι μου κάτι 'Linq to Amazon' κλπ.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Οπότε καταλήγουμε στο συμπέρασμα ότι πέρα από την δημιουργία Linq providers, δεν έχουμε άλλη χρήση για τα expression trees;&lt;/div&gt;</description></item><item><title>Απ: Expression Trees</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67114.aspx</link><pubDate>Wed, 07 Sep 2011 23:59:54 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67114</guid><dc:creator>George J. Capnias</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67114.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67114</wfw:commentRss><description>&lt;p&gt;Προσωπικά τα expression trees έρχονται στο μυαλό μου κάθε φορά που σκέφτομαι το Linq2&amp;lt;Something&amp;gt; - στο &amp;lt;Something&amp;gt; βάλε ότι θες. Ουσιαστικά είναι αυτά που πέρνουν τα lamdas και τα μετατρέπουν σε SQL όταν μιλάμε για Linq2Sql, σε FBQL όταν μιλάμε για Linq2Facebook, κ.ο.κ.&lt;/p&gt;&lt;p&gt;Αυτό είναι μια μορφή serialization - δεν είναι όμως προσέγγιση για αυτό που περιγράφεις: να αποθηκεύεις κώδικα σε Db και μετά να τον κάνεις retrieve και να τον εκτελείς...&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;George J.&lt;br&gt;&lt;/p&gt;</description></item><item><title>Expression Trees</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67111.aspx</link><pubDate>Wed, 07 Sep 2011 19:13:24 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67111</guid><dc:creator>dimos.homatas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67111.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67111</wfw:commentRss><description>Καλησπέρα σας,&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;η ερώτηση είναι απλή: που χρησιμεύουν τα expression trees; που μπορώ να τα χρησιμοποιήσω πρακτικά;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Το μόνο που πάει το μυαλό μου είναι το serialization - η δυνατότητα να μπορούμε να αποθηκεύουμε κώδικα και να εκτελούμε κώδικα πχ από μία ΒΔ. Δυστυχώς όμως, και εδώ ο τομέας χωλαίναι: τα expression trees δεν είναι serializable (και μάλλον σωστά). Βρήκα ένα 3rd party serializer, αλλά έχει τα όριά του ( &lt;a href="http://archive.msdn.microsoft.com/exprserialization"&gt;Expression Tree Serialization&lt;/a&gt;&amp;nbsp;), στην δοκιμή που έκανα μπόρεσα να κάνω serialize μόνο ένα lambda και όχι ένα υπάρχον procedure.&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Επίσης να επισημάνω και αυτό το σημείο, απευθείας από το MSDN :&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;"&lt;span class="Apple-style-span" style="font-family:'Segoe UI', Verdana, Arial;"&gt;&lt;i&gt;In .NET Framework 4, the expression trees API also supports assignments and control flow expressions such as loops, conditional blocks, and&amp;nbsp;&lt;span&gt;&lt;span class="input"&gt;try-catch&lt;/span&gt;&lt;/span&gt;&amp;nbsp;blocks. By using the API, you can create expression trees that are more complex than those that can be created from lambda expressions by the C# and Visual Basic compilers.&lt;/i&gt;&lt;/span&gt;"&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Και λέω λοιπόν, για να επανέλθω: άντε και χρησιμοποιώ το .ΝΕΤ 4 (τώρα έχω 3.5). Και πάλι, που μπορώ να χρησιμοποιήσω πρακτικά τα expression trees? Σε κάποιο design pattern ίσως;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;</description></item></channel></rss>