2012-08-01 13 views
5

के साथ लिंक मेरे पास सूची है जहां MyType: DynamicObject। डायनामिक ऑब्जेक्ट से विरासत में माईटाइप का कारण यह है कि मुझे एक प्रकार की आवश्यकता है जिसमें अज्ञात संख्या में गुण हो सकते हैं।डायनामिक ऑब्जेक्ट

यह सब ठीक काम करता है जब तक कि मुझे सूची फ़िल्टर करने की आवश्यकता न हो।

return all items where any of the properties is empty string or white space? 
+0

ऐसे अन्य प्रकार हैं जिनमें अज्ञात गुण हो सकते हैं, जैसे 'ExpandoObject'। यदि आप 'डायनामिक ऑब्जेक्ट 'के बजाय' ExpandoObject' का उपयोग कर सकते हैं तो आपका जीवन परिमाण के आदेशों का आसान होगा। – dasblinkenlight

+0

मुझे यह जांचना होगा कि यूआई नियंत्रण है कि मैं समर्थन का उपयोग कर रहा हूं ExpandoObject, लेकिन यदि वे करते हैं, तो मुझे डायनामिक ऑब्जेक्ट से ExpandoObject में संक्रमण करने में कोई समस्या नहीं है। सवाल यह है कि, क्या मैं सूची के साथ linq क्वेरी से ऊपर कर सकता हूं? – Goran

उत्तर

1

खैर जब तक प्रत्येक ऑब्जेक्ट के गुणों अज्ञात नहीं are internally खुद को आप यह कर सकता है: वहाँ एक रास्ता मैं एक LINQ कि कुछ इस तरह करना होगा कर सकते हैं।

वहाँ, एक गतिशील वस्तु के सभी गुणों का परीक्षण करने के लिए आप पर DynamicObject आप आशा implementer कार्यान्वित GetDynamicMemberNames() और आप getting the property names के लिए nuget पैकेज ImpromptuInterface के तरीकों का उपयोग कर सकते हैं और नियंत्रण नहीं है, तो एक महान सामान्य तरीका नहीं है dynamically invoking those names

return allItems.Where(x=> Impromptu.GetMemberNames(x, dynamicOnly:true) 
         .Any(y=>String.IsNullOrWhiteSpace(Impromptu.InvokeGet(x,y)); 

अन्यथा, यह अपने स्वयं के प्रकार MyType आप अपने खुद के विधि है कि उन सदस्य मूल्यों के लिए आंतरिक लेखा देख सकते हैं जोड़ सकते हैं के बाद से।

return allItems.Where(x => x.MyValues.Any(y=>String.IsNullOrWhitespace(x)); 
3

(टिप्पणी से) मैं सूची के साथ LINQ क्वेरी ऊपर कर सकते हैं?

var list = new List<ExpandoObject>(); 
dynamic e1 = new ExpandoObject(); 
e1.a = null; 
e1.b = ""; 
dynamic e2 = new ExpandoObject(); 
e2.x = "xxx"; 
e2.y = 123; 
list.Add(e1); 
list.Add(e2); 
var res = list.Where(
    item => item.Any(p => p.Value == null || (p.Value is string && string.IsNullOrEmpty((string)p.Value))) 
); 

ExpandoObject एक अंतरफलक आप अपनी संपत्ति और मान के जोड़े की गणना के रूप में यदि वे एक शब्दकोश में थे देता है कि प्रस्तुत करता है, बनाने की प्रक्रिया:

हाँ, यहाँ कैसे आप ExpandoObject के साथ क्या कर सकते हैं उन्हें बहुत आसान जांचने के लिए।

+0

एक्सपोन्डोब्जेक्ट के सूचक के लिए धन्यवाद। मैं इसे +1 दे रहा हूं, लेकिन इसे उत्तर के रूप में स्वीकार नहीं कर सकता क्योंकि मैं ExpandoObject से प्राप्त नहीं कर सकता, और चूंकि jbtule ने सीधे मेरे प्रश्न का उत्तर दिया है। – Goran

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