2008-12-31 12 views
63

अभिव्यक्ति पेड़ एक अच्छी सुविधा है, लेकिन इसके व्यावहारिक उपयोग क्या हैं? क्या उन्हें किसी प्रकार की कोड जनरेशन या मेटाप्रोग्रामिंग या कुछ ऐसे के लिए इस्तेमाल किया जा सकता है?अभिव्यक्ति पेड़ों का व्यावहारिक उपयोग

+0

संभावित डुप्लिकेट [कुछ उदाहरण क्या हैं जिनमें अभिव्यक्ति पेड़ उपयोगी हैं?] (Http://stackoverflow.com/questions/27726/what-are-some-instances-in-which-expression-trees-are- उपयोगी) – nawfal

उत्तर

4

आप Google या फ़्लिकर या अमेज़ॅन, अपनी वेबसाइट या अन्य डेटा प्रदाता जैसी वेबसाइट के लिए अपना स्वयं का linq प्रदाता बनाने के लिए उनका उपयोग कर सकते हैं।

20

मार्क ग्रेवेल ने generic operators को लागू करने के लिए MiscUtil में उन्हें बहुत प्रभावशाली उपयोग किया है।

+11

डर्न, मुझे इसे हराया ;- –

8

LINQ प्रदाताओं का कार्यान्वयन ज्यादातर अभिव्यक्ति वृक्षों को संसाधित करके किया जाता है। मैं भी उन्हें उपयोग कर रहा हूँ मेरे कोड से शाब्दिक तार को हटाने के लिए:

41

जॉन नोटों के रूप में, मैं उन्हें इस्तेमाल .NET 3.5 के साथ generic operators प्रदान करने के लिए। मैं गैर-डिफ़ॉल्ट कन्स्ट्रक्टरों तक तेज़ी से पहुंच प्रदान करने के लिए उन्हें (फिर से MiscUtil) का उपयोग भी करता हूं (आप Delegate.CreateDelegate का उपयोग कन्स्ट्रक्टर के साथ नहीं कर सकते हैं, लेकिन Expression ठीक काम करता है)।

मैन्युअल बनाया अभिव्यक्ति के पेड़ के अन्य उपयोग:

लेकिन वास्तव में, अभिव्यक्ति किसी भी गतिशील कोड लिखने का एक बहुत ही बहुमुखी तरीका है। Reflection.Emit से बहुत आसान है, और मेरे पैसे के लिए, कोडडॉम से समझने में आसान है। और .NET 4.0 में, आपके पास even more options उपलब्ध है। मैं Expressionon my blog के माध्यम से कोड लिखने के मूलभूत सिद्धांतों को दिखाता हूं।

+0

धन्यवाद। ब्लॉग नहीं दिखा रहा है !!! – pixparker

+0

@ पिक्स्पाकर मैंने अभी इसका परीक्षण किया: ठीक काम कर रहे –

12

मैं गतिशील प्रश्न बनाने के लिए उनका उपयोग करता हूं, चाहे वह डेटा को सॉर्ट या फ़िल्टर करने के लिए हो। एक उदाहरण के रूप:

IQueryable<Data.Task> query = ctx.DataContext.Tasks; 

if (criteria.ProjectId != Guid.Empty) 
     query = query.Where(row => row.ProjectId == criteria.ProjectId); 

if (criteria.Status != TaskStatus.NotSet) 
     query = query.Where(row => row.Status == (int)criteria.Status); 

if (criteria.DueDate.DateFrom != DateTime.MinValue) 
     query = query.Where(row => row.DueDate >= criteria.DueDate.DateFrom); 

if (criteria.DueDate.DateTo != DateTime.MaxValue) 
    query = query.Where(row => row.DueDate <= criteria.DueDate.DateTo); 

if (criteria.OpenDate.DateFrom != DateTime.MinValue) 
    query = query.Where(row => row.OpenDate >= criteria.OpenDate.DateFrom); 

var data = query.Select(row => TaskInfo.FetchTaskInfo(row)); 
2

मूलतः Jomo Fisher द्वारा, Gustavo Guerra static string dictionary का एक संशोधित संस्करण प्रकाशित किया।

अभिव्यक्ति पेड़ के माध्यम से, एक गतिशील अभिव्यक्ति जो वास्तव में (पढ़ना: हास्यास्पद) शब्दकोश प्रदान करती है।

कार्यान्वयन एक गतिशील निर्णय पेड़ बनाता है जो इनपुट स्ट्रिंग की लंबाई के अनुसार कोरेंट मान का चयन करता है, फिर पहले अक्षर से, फिर दूसरा अक्षर और इसी तरह।

यह अंततः समकक्ष शब्दकोश की तुलना में बहुत तेज़ चलता है।

13

मैं सिर्फ ExpressionTree का उपयोग कर एक generic filter function बनाया .. मैं तुम लोगों के साथ share करना चाहते हैं ...

Start

var allFiltered= Filter(AllCustomer, "Name", "Moumit"); 

public static List<T> Filter<T>(this List<T> Filterable, string PropertyName, object ParameterValue) 
{ 
    ConstantExpression c = Expression.Constant(ParameterValue); 
    ParameterExpression p = Expression.Parameter(typeof(T), "xx"); 
    MemberExpression m = Expression.PropertyOrField(p, PropertyName); 
    var Lambda = Expression.Lambda<Func<T, Boolean>>(Expression.Equal(c, m), new[] { p }); 
    Func<T, Boolean> func = Lambda.Compile(); 
    return Filterable.Where(func).ToList(); 
} 

One More

string singlePropertyName=GetPropertyName((Property.Customer p) => p.Name); 

public static string GetPropertyName<T, U>(Expression<Func<T, U>> expression) 
{ 
     MemberExpression body = expression.Body as MemberExpression; 
     // if expression is not a member expression 
     if (body == null) 
     { 
      UnaryExpression ubody = (UnaryExpression)expression.Body; 
      body = ubody.Operand as MemberExpression; 
     } 
     return string.Join(".", body.ToString().Split('.').Skip(1)); 
} 

Make it more expandable

string multiCommaSeparatedPropertyNames=GetMultiplePropertyName<Property.Customer>(c => c.CustomerId, c => c.AuthorizationStatus) 

public static string GetMultiplePropertyName<T>(params Expression<Func<T, object>>[] expressions) 
{ 
     string[] propertyNames = new string[expressions.Count()]; 
     for (int i = 0; i < propertyNames.Length; i++) 
     { 
      propertyNames[i] = GetPropertyName(expressions[i]); 
     } 

     return propertyNames.Join(); 
} 

....... मैं यह भी Reflection उपयोग किया जा सकता पता है ... लेकिन यह एक जबरदस्त तेज़ है या मैंके बराबर कह सकता हूं पहले संकलन के बाद... पहला पहला पुनरावृत्ति केवल औसत 10 मिलीसेकंद धीमा है ... तो यह Expression Tree जादू है। सरल और शानदार .... मुझे लगता है ... !!!!!!!!

+0

अच्छा! उदाहरणों के लिए धन्यवाद। –

संबंधित मुद्दे