2011-09-23 20 views
9

मेरे पास एक ऐसा कार्य सेटअप है जो दृढ़ता से टाइप नहीं किया गया है और प्रतिबिंब पर निर्भर करता है।लैम्ब्डा अभिव्यक्ति एक संपत्ति के रूप में

मैं एक वर्ग है, कहते हैं कि

class Person{ 

    public string FirstName {get ; set;} 
    public string LastName {get; set;} 
    public int Age {get; set;} 
    ... 
    // some more public properties 
} 

और

class CellInfo { 
    public string Title {get; set;} 
    public string FormatString {get; set;} 
} 

और मैं इस

Dictionary<string, CellInfo> fields = new Dictionary<string, CellInfo>(); 
fields.Add("FirstName", new CellInfo {Title = "First Name", FormatString = "Foo"}); 
fields.Add("LastName", new CellInfo {Title = "Last Name", FormatString = "Bar"}); 

यह संपत्ति के नाम के साथ एक सरल शब्दकोश और के बारे में कुछ जानकारी है? जैसी शब्दकोश है उन्हें। मैं एक मॉड्यूल है कि व्यक्ति उदाहरणों प्रक्रियाओं के लिए शब्दकोश गुजरती हैं और मैं

Dictionary<string, CellInfo> fields = SomeMethodToGetDictionary(); 
foreach(Person p in someCollection) 
{ 
    foreach(var field in fields) 
    { 
     object cellValue = type(Person).GetProperty(field.Key).GetValue(p, null); 
     // use cellValue and info on field from field.Value somewhere. 
     ... 
    } 
} 

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

क्या मैं मन में था इस

fields.Add("FirstName", new CellInfo 
        { 
         Title = "First Name", 
         FormatString = "Foo", 
         EvalExpression = p => p.FirstName 
        }); 

की तरह और उपयोग के दौरान एक संपत्ति है कि एक LINQ अभिव्यक्ति संग्रहीत, कुछ हो रही थी, किसी तरह एक व्यक्ति वस्तु पर EvalExpression का उपयोग करें और संपत्ति के मूल्य मिलता है। मेरे पास कोई सुराग नहीं है कि कहां से शुरू किया जाए या सिंटैक्स इस तरह की संपत्ति की तरह होगा, जो मूल्यांकन योग्य है। मैं प्रतिनिधि प्रतिनिधियों और अभिव्यक्ति पेड़ों के लिए नया हूं कि मुझे खोजने के लिए सही कीवर्ड भी नहीं पता हैं। आशा है कि मेरा विवरण स्पष्ट है; यदि नहीं, तो मुझे बताएं और मैं आवश्यकतानुसार विवरण दूंगा। किसी भी सहायता की बहुत सराहना की जाएगी।

उत्तर

1

आप तारों के रूप में संपत्ति के नाम कोड करने के लिए नहीं करने के लिए कुछ इस तरह की कोशिश कर सकते हैं अगर यह कह दृढ़ता से टाइप किया द्वारा तुम क्या मतलब है:

class CellInfo<T> 
{ 
    public string Title { get; set; } 
    public string FormatString { get; set; } 
    public Func<T, object> Selector { get; set; } 
} 

Dictionary<string, CellInfo<Person>> dict = new Dictionary<string, CellInfo<Person>>(); 

dict.Add("LastName", new CellInfo<Person> { Selector = p => p.LastName }); 
dict.Add("Age", new CellInfo<Person> { Selector = p => p.Age }); 

foreach (Person p in someCollection) 
{ 
    foreach (var cellInfo in dict) 
    { 
     object value = cellInfo.Value.Selector(p); 
    } 
} 
-1

(आपका प्रश्न स्पष्ट लेकिन लंबा है। प्रारंभिक सामान ट्रिम।)

यह कैसे ASP.NET MVC एचटीएमएल आदानों, आदि पर फ़ील्ड नाम बनाने यदि आप एक हो सकता था तो के लिए प्रतिबिंब और लैम्ब्डा अभिव्यक्ति का उपयोग करती है उस मामले के लिए स्रोत कोड देखें।

सरल शब्दों में, आपको अपनी अभिव्यक्ति को सदस्य अभिव्यक्ति में डालना होगा और नाम प्राप्त करना होगा। आसान:

MemberExpression memberExpression = EvalExpression.Body as MemberExpression; 
if (memberExpression == null) 
    throw new InvalidOperationException("Not a memberExpression"); 

if (!(memberExpression.Member is PropertyInfo)) 
    throw new InvalidOperationException("Not a property"); 

return memberExpression.Member.Name; // returns FirstName 
+0

किसी को भी ग परवाह करता है ओममेंट क्यों डाउनवोट? – Aliostad

+0

यह पहली पंक्ति पर आदेश (अनुरोध के विपरीत) हो सकता है। – MikeKulls

0

मुझे लगता है कि एक प्रतिनिधि आपको चाहिए। कुछ इस तरह:

public delegate string EvalExpressionDelegate (Person); 

class CellInfo 
{ 
    public string Title {get; set;} 
    public string FormatString {get; set;} 
    public EvalExpressionDelegate EvalExpression = null; 
} 

fields.Add("FirstName", new CellInfo 
        { 
         Title = "First Name", 
         FormatString = "Foo", 
         EvalExpression = p => p.FirstName 
        }); 
+0

+1 अच्छी जानकारी। मुझे लगता है कि 'Func ' आपके प्रतिनिधि के लिए एक शॉर्टेंड है और किसी को इसका एहसास नहीं हुआ और आपको एक डाउनवोट दिया गया। –

+0

@ प्रोफेसर कैओस मुझे लगता है कि डाउनवोट शायद इसलिए है क्योंकि प्रतिनिधि को लिखना इसे करने का पुराना तरीका माना जाता है, हालांकि इसमें पैरामीटर नामकरण जैसे फायदे हो सकते हैं। – MikeKulls

2

उपयोग एक प्रतिनिधि :

class CellInfo { 
    public string Title {get; set; } 
    public string FormatString {get; set; } 
    public Func<Person, object> EvalExpression { get; set; } 
} 

फिर अपने लैम्ब्डा इनपुट काम करेंगे ...

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