LINQ

2012-06-14 9 views
6

का उपयोग कर वर्ग गुणों पर इटरेटिंग एक पार्सड टेम्पलेट क्लास है जिसमें 300 से अधिक संपत्ति (टाइप विवरण और ब्लॉक विवरण) हैं। पार्सड टेम्पलेट ऑब्जेक्ट फ़ंक्शन द्वारा भर दिया जाएगा। इस ऑब्जेक्ट को भरने के बाद मुझे "बॉडी" या "आईएमजी" जैसी कोई संपत्ति खोजने के लिए LINQ (या अन्य तरीका) की आवश्यकता है जहां IsExist=false और Priority="high" है।LINQ

मेरी मशीन पर
bool isMatching = (from prop in typeof(ParsedTemplate).GetProperties() 
        where typeof(Details).IsAssignableFrom(prop.PropertyType) 
        let val = (Details)prop.GetValue(parsedTemplate, null) 
        where val != null && !val.IsExist && val.Priority == "high" 
        select val).Any(); 

काम करता है:

public class Details 
{ 
    public bool IsExist { get; set; } 
    public string Priority { get; set; } 
} 

public class BlockDetails : Details 
{ 
    public string Block { get; set; } 
} 

public class ParsedTemplate 
{ 
    public BlockDetails body { get; set; } 
    public BlockDetails a { get; set; } 
    public Details img { get; set; } 
    ... 
} 
+5

यह वास्तव में करने के लिए आसान है प्रतिबिंब के साथ करें, लेकिन मुझे नहीं पता कि LINQ कैसे उपयोगी होगा। LINQ के साथ हर समस्या को हल करने का प्रयास क्यों करता है? – cadrell0

+2

@ cadrell0 क्योंकि लोग सोचते हैं कि LINQ एक रजत बुलेट – sloth

+2

@ cadrell0 है और उन सभी अजीब वाक्यविन्यास जो कि लेजर सामान को केवल LINQ – sloth

उत्तर

7

आपको इस भूख को बनाने के लिए अपनी खुद की विधि लिखने की आवश्यकता होगी। सौभाग्य से, यह लंबे समय तक होने की जरूरत नहीं है। कुछ की तरह:

static IEnumerable<Details> GetDetails(ParsedTemplate parsedTemplate) 
{ 
    return from p in typeof(ParsedTemplate).GetProperties() 
      where typeof(Details).IsAssignableFrom(p.PropertyType) 
      select (Details)p.GetValue(parsedTemplate, null); 
} 

फिर आप, यदि आप जांच करने के लिए यदि कोई संपत्ति एक ParsedTemplate वस्तु पर "मौजूद है" चाहता था, उदाहरण के लिए, LINQ इस्तेमाल कर सकते हैं:

var existingDetails = from d in GetDetails(parsedTemplate) 
         where d.IsExist 
         select d; 
3

तुम सच में, जबकि कर रही LINQ उपयोग करना चाहता था, तो आप उस तरह कुछ की कोशिश कर सकते।

या विस्तार विधि वाक्य रचना में:

isMatching = typeof(ParsedTemplate).GetProperties() 
       .Where(prop => typeof(Details).IsAssignableFrom(prop.PropertyType)) 
       .Select(prop => (Details)prop.GetValue(parsedTemplate, null)) 
       .Where(val => val != null && !val.IsExist && val.Priority == "high") 
       .Any(); 
1

उपयोग सी # प्रतिबिंब। उदाहरण के लिए:

ParsedTemplate obj; 
PropertyInfo pi = obj.GetType().GetProperty("img"); 
Details value = (Details)(pi.GetValue(obj, null)); 
if(value.IsExist) 
{ 
    //Do something 
} 

मैंने संकलित नहीं किया है, लेकिन मुझे लगता है कि यह काम करता है।

0
 ParsedTemplate tpl = null; 
     // tpl initialization 
     typeof(ParsedTemplate).GetProperties() 
      .Where(p => new [] { "name", "img" }.Contains(p.Name)) 
      .Where(p => 
       { 
        Details d = (Details)p.GetValue(tpl, null) as Details; 
        return d != null && !d.IsExist && d.Priority == "high" 
       }); 
+0

हालांकि यह दान ताओ के उत्तर के समान ही है, यह उतना ही पुन: प्रयोज्य नहीं है जितना कि समस्या के लिए मूल रूप से जटिल है * यदि आपको किसी भी बदलाव के लिए इसे दोहराने की आवश्यकता है *)। –

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