2012-02-17 40 views
9

के रूप में संपत्ति के नामों की सूची उत्तीर्ण करने का सबसे अच्छा तरीका मेरे पास MyDummyClass है जिसमें मैं बाद में मूल्यांकन के लिए लैम्ब्डा अभिव्यक्ति के रूप में कुछ गुणों को पास करना चाहता हूं। तो क्या मैं की तरहलैम्ब्डा अभिव्यक्ति

public class MyDummyClass<T> 
{ 
    public MyDummyClass(Expression<Func<T, object>> property) 
    { 
     ... 
    } 
    ... 
} 

कुछ कर सकते हैं ..और फिर, सही new MyDummyClass<Person>(x=>x.Name) की तरह उस वर्ग का उपयोग करें?

लेकिन फिर मैं न केवल एक संपत्ति बल्कि संपत्तियों की एक सूची को पास करना चाहता हूं। इसलिए मैं की तरह

public class MyDummyClass<T> 
{ 
    public MyDummyClass(IEnumerable<Expression<Func<T, object>>> properties) 
    { 
     ... 
    } 
    ... 
} 

मेरी कक्षा लिखने और मैं तरह new MyDummyClass<Person>(new[] { x=>x.Name, x=>x.Surname }) की तरह उपयोग करने के लिए लेकिन दुर्भाग्य है कि काम नहीं करता चाहते! इसके बजाय मुझे

new MyDummyClass<Person> 
    (new Expression<Func<Person, object>>[] { x=>x.Name, x=>x.Surname}); 

लिखना है, लेकिन यह लिखने के लिए थोड़ा अजीब है, है ना? बेशक, पैराम का उपयोग काम करेगा, लेकिन यह कोड के एक अधिक जटिल टुकड़े से सिर्फ एक नमूना है जहां पैराम्स का उपयोग कर विकल्प नहीं है। किसी के पास इस से बाहर आने के लिए बेहतर विकल्प है ??

+3

आप 'पैराम्स 'का उपयोग क्यों नहीं करना चाहते हैं? यह सबसे आसान तरीका है, और यह प्रतिनिधि प्रकार निर्दिष्ट किए बिना काम करेगा। –

+0

मैं भी पैरा के लिए वोट देता हूं। यह वाक्यविन्यास को बहुत साफ रखेगा और दृश्यों के पीछे यह एक सरणी का उपयोग करेगा जो आप पहले स्थान पर करना चाहते थे! – Umair

+0

निश्चित रूप से, इस सरल उदाहरण में यह होगा, लेकिन मैंने इसे एक अधिक जटिल से बाहर ले लिया जहां मैं पैरा का उपयोग नहीं कर सकता क्योंकि इसमें अन्य वैकल्पिक पैरामीटर हैं जो इसलिए काम नहीं करेंगे ... दुख की बात है – Juri

उत्तर

3

आप की कोशिश कर सकते:

public MyDummyClass(params Expression<Func<T, object>>[] properties) 

तो फिर तुम क्या करने में सक्षम होना चाहिए इस तरह:

MyDummyClass<Person> cls = new MyDummyClass<Person>(item => new[] { item.Name, item.Surname }); 

समस्या यह है कि यह आपको संपत्ति का मूल्य नहीं देगा क्योंकि कोई वास्तविक व्यक्ति उदाहरण यह निर्दिष्ट नहीं है कि "obj" पर एक ToString करना आपको संपत्ति का नाम देगा। मुझे नहीं पता कि यह आपके बाद क्या है, लेकिन यह शायद एक शुरुआती बिंदु है।

+0

संपत्ति पथ को बाद में निकालना कोई मुद्दा नहीं है, मेरे पास पहले से ही है ... लेकिन thx, आपका दृष्टिकोण संभव हो सकता है। – Juri

+0

मुझे लगता है कि इस दृष्टिकोण का मुख्य लाभ यह है कि कन्स्ट्रक्टर (2 स्निपेट) में गुणों को पार करना एक सरल, कम अजीब, वाक्यविन्यास है और जो आपके मूल पद में आपने जो बताया है उसके करीब है। – MotoSV

+0

मुझे एक समस्या है जब व्यक्ति वर्ग में विभिन्न प्रकार के गुण होते हैं। उदाहरण के लिए, इसमें एक संपत्ति आयु (int) होगी। कुछ मदद?[अद्यतन] नई ऑब्जेक्ट का उपयोग करके [] सही है – fravelgue

6

का उपयोग करके देखें पैरामीटर बजाय: तो आप इसके कहेंगे

public class MyDummyClass<T> 
{ 
    public MyDummyClass(Expression<Func<T, object>> expression) 
    { 
     NewArrayExpression array = expression.Body as NewArrayExpression; 
     foreach(object obj in (IEnumerable<object>)(array.Expressions)) 
     { 
      Debug.Write(obj.ToString()); 
     } 
    } 
} 

और:

var dummy = new DummyClass<Person>(x => x.Name, x => x.Surname); 
+0

संपादन के लिए धन्यवाद, मैंने लिखा कि मेरे आईफोन पर ट्रेन पर ... –

+0

बेशक, मुझे पता है कि यह पैराम्स के साथ काम करेगा, मैं इसे अपनी विशिष्ट स्थिति में उपयोग नहीं कर सकता। 'क्योंकि इसमें कुछ वैकल्पिक पैरा हैं और इसलिए यह काम नहीं करता है ... – Juri

+0

बहुत प्यारी .. बस डॉ। आदेश दिया !! – gcoleman0828

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