2010-10-17 11 views
5

है मेरे पास एक प्रकार SearchBag है जिसमें खोज मूल्यों को पार करने के लिए उपयोग करने के लिए स्ट्रिंग्स और नलबल पूर्णांक का एक गुच्छा है। मुझे यह जांचने का एक तरीका चाहिए कि खोज बैग में कोई मान है या नहीं।जांच कर रहा है कि क्या किसी भी संपत्ति को मूल्य

मैं वर्तमान में इस तरह यह करने के लिए कोशिश कर रहा हूँ:

public bool HasValues() 
    { 
     return GetType().GetProperties().Any(p => p.GetValue(this, null) != null); 
    } 

लेकिन वहाँ एक बेहतर तरीका है सोच रहा था।

+0

मेरे मन में, यह यह करने के लिए जब तक आप प्रमुख प्रदर्शन चिंता है एक पूरी तरह से वैध तरीका है। – steinar

+0

सुनिश्चित नहीं है कि यह एक बेहतर तरीका है लेकिन आप INotifyPropertyChanged इंटरफ़ेस को कार्यान्वित कर सकते हैं। –

उत्तर

4

SearchBag प्रकार को संशोधित किए बिना, कोई बेहतर तरीका नहीं है।

संपादित करें: आप प्रत्येक संपत्ति सेटटर में एक बूलियन ध्वज सेट करने के लिए प्रकार बदल सकते हैं, फिर प्रतिबिंब का उपयोग करने के बजाय ध्वज की जांच करें।

+0

मुझे इसे बदलने से कुछ भी नहीं बचाता है .. –

+0

@boris: मेरा संपादन देखें। – SLaks

+0

Thx। हां इसके बारे में सोचा लेकिन मुझे सभी ऑटो गुणों को मूल्य समर्थित गुणों में परिवर्तित करने और प्रत्येक सेटर में तर्क लागू करने की आवश्यकता होगी। यह एक विकल्प है, लेकिन मुझे लगता है कि प्रतिबिंब लागत इसके लायक नहीं है। सलाह के लिये धन्यवाद। –

1

आप संपत्ति मूल्य बदलने के अनुरोध को रोकने के लिए Post Sharp का उपयोग कर सकते हैं। आप सभी खोज वर्गों को List<string> के साथ एक सामान्य कक्षा से प्राप्त कर सकते हैं। फिर जब भी मूल्य बदलता है उस शब्दकोश में एक संपत्ति नाम जोड़ने के लिए एक पहलू विशेषता बनाएं। निम्नलिखित सिर्फ एक नमूना है, और कीड़े है:

[Serializable] 
public class PropertyChangeAwareAttribute : OnMethodBoundaryAspect 
{ 
    public override void OnEntry(MethodExecutionEventArgs eventArgs) 
    { 
     if (eventArgs.Method.Name.StartsWith("set_")) 
      ((SearchBagBase)eventArgs.Instance).PropertiesChanged.Add(eventArgs.Method.Name); 
     base.OnEntry(eventArgs); 
    } 
} 


abstract class SearchBagBase 
{ 
    public List<string> PropertiesChanged = new List<String>(); 
} 

[PropertyChangeAware] 
class RegularSearch : SearchBagBase 
{ 
    public String Key { get; set; } 
} 
उपयोग के साथ

:

RegularSearch regularSearch = new RegularSearch(); 
regularSearch.Key = "toys"; 
regularSearch.PropertiesChanged.ForEach(Console.WriteLine); 
+0

जैसा कि मैं पोस्टशर्प से अपरिचित हूं, पोस्ट पोस्ट पर मुझे एक नज़र आया था। अपने उदाहरण के लिए तत्पर हैं –

+0

सुनिश्चित नहीं है कि मेरे विशेष मामले में परावर्तक ओवरहेड परेशानी के लायक है, लेकिन यह पूरी तरह से एक दिलचस्प पुस्तकालय की तरह लगता है। मैं इसे बाद में उपयोग के लिए ध्यान में रखूंगा। Thx :) –

+0

@boris मैंने इस लाइब्रेरी का उपयोग करके एक समाधान बनाया है ताकि यह बताने के लिए कि डेटाबेस से डेटा का एक टुकड़ा गंदा था या नहीं। यह कई अन्य परिस्थितियों में पुन: प्रयोज्य हो गया। –

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