2009-11-09 11 views
6

मैं सी # निम्नलिखितसी # सी # 3.0 (2009) में वैकल्पिक गुण

public class Person 
{ 
    public string Name { get; set;} 
    public optional string NickName { get; set;} 
    ...many more properties... 
} 
तो

कि जब मैं एक व्यक्ति वस्तु बनाने मैं आसानी से एक साधारण में इनपुट मानों की वैधता की जांच कर सकते हैं के रूप में वैकल्पिक गुणों का समर्थन करता है, तो सोच रहा हूँ लूप

public bool IsInputOK(Person person) 
{ 
    foreach(var property in person.GetType().GetProperties()) 
    { 
     if(property.IsOptional()) 
     { 
      continue; 
     } 
     if(string.IsNullOrEmpty((string)property.GetValue(person,null))) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

मैंने Google पर खोज की है लेकिन वांछित समाधान नहीं मिला है। क्या मुझे वास्तव में प्रत्येक संपत्ति के लिए मैन्युअल रूप से कोड सत्यापन कोड सौंपना है?

धन्यवाद।

+3

मुझे लगता है कि जिस तरह से एक भयानक वस्तु सत्यापन प्रदर्शन करने के लिए है। यह गंध करता है ... –

+0

मैंने सोचा कि यह सबसे अच्छा तरीका था :(... मैं इस दृष्टिकोण का उपयोग करके दोहराव कोड के लगभग 100 लाइनों को बचा सकता हूं। हालांकि मैं मानता हूं कि प्रदर्शन प्रतिबिंब का उपयोग करके थोड़ा सा दर्द करेगा। –

+2

क्या आपको परवाह है गंध पर विस्तार करने के लिए? –

उत्तर

22

आप इन गुणों को उस विशेषता के साथ सजाने के लिए कर सकते हैं जिसे आप परिभाषित करते हैं और गुणों को वैकल्पिक रूप से चिह्नित करते हैं।

[AttributeUsage(AttributeTargets.Property, 
       Inherited = false, 
       AllowMultiple = false)] 
internal sealed class OptionalAttribute : Attribute 
{ 
} 

public class Person 
{ 
    public string Name { get; set; } 

    [Optional] 
    public string NickName { get; set; } 
} 

public class Verifier 
{ 
    public bool IsInputOK(Person person) 
    { 
     foreach (var property in person.GetType().GetProperties()) 
     { 
      if (property.IsDefined(typeof(OptionalAttribute), true)) 
      { 
       continue; 
      } 
      if (string.IsNullOrEmpty((string)property.GetValue(person, null))) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

तुम भी Validation Application Block जो बॉक्स से बाहर समान क्षमता है पर एक नज़र लेने के लिए कर सकते हैं।

+0

यह तेज़ है, ठीक वही है जो मैं ढूंढ रहा हूं। आपका बहुत बहुत धन्यवाद। –

2

सी # में 'वैकल्पिक' कीवर्ड नहीं है, और @Mitch Wheat कहते हैं, यह सत्यापन करने का एक भयानक तरीका है।

आप प्रॉपर्टी सेटर में सत्यापन क्यों नहीं कर सकते?

+0

कोई फर्क नहीं पड़ता कि मैं किस प्रकार की वैधता सेटटर में डालता हूं। अगर सेटर को बिल्कुल नहीं कहा जाता है तो मैं डेटा को सत्यापित नहीं कर पाऊंगा :) –

0

यदि आप गुणों के साथ प्रोप को टैग करना चाहते हैं और अपना स्वयं का सत्यापन कोड नहीं रोल करना चाहते हैं, तो सत्यापन फ्रेमवर्क का प्रयास क्यों न करें?

http://www.codeplex.com/ValidationFramework

+0

क्योंकि मेरे छोटे काम के लिए एक ढांचा थोड़ा अधिक लगता है। मुझे समय मिलने पर मैं इसे देख लूंगा। इनपुट के लिए धन्यवाद। –

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