2014-04-10 25 views
5

का उपयोग कर शून्य पैरामीटर के लिए जाँच करें क्या एक विशेषता का उपयोग कर पैरामीटर के मान को जांचना संभव है? मैंने कुछ सिस्टम विशेषताओं जैसे [FromUri] को इस तरह इस्तेमाल किया है। मैं कुछ इस तरह के लिए उम्मीद कर रहा हूँ:एक विशेषता

public void Method([NotNull] string name, [NotNull] DateTime? date) 
{ } 

जहां NotNull एक विशेषता यह है कि यदि यह रिक्त है देखने के लिए मूल्य जांच करता है। यदि मान शून्य है तो यह एक त्रुटि फेंक देगा।

यहाँ मैं वर्तमान में

मैं वर्तमान में निर्धारित करने के लिए मान शून्य है एक स्थिर सहायक वर्ग है कि एक अभिव्यक्ति और पैरामीटर ही ले जाता है का उपयोग कर रहा है और के नाम निर्धारित करने के लिए अभिव्यक्ति का उपयोग करता है पैरामीटर।

// Invoke method within ArgumentHelper class 
ArgumentHelper.RequireNotNullOrEmpty(() => state, state); 

// Method within static class ArgumentHelper 
public static void RequireNotNullOrEmpty<T>(this Expression<Func<T>> argumentExpression, string value) 
    { 
     var body = ((MemberExpression)argumentExpression.Body); 
     if (string.IsNullOrEmpty(value)) 
     { 
      // Throw error "Required field '" + body.Member.Name + "' is missing."; 
     } 
    } 

बोनस: यह भी अच्छा होगा यदि मैं किसी भी तरह सिर्फ मेरे वर्तमान समाधान की तरह अपने नाम के साथ एक स्ट्रिंग गुजर, बिना वैरिएबल का नाम हो सकता है किया जाएगा।

+1

आपका स्थिर सहायक वर्ग एक बहुत अधिक के लिए एक सरल '== null' – Sayse

+0

* यह संभव मूल रूप से एक विशेषता का उपयोग कर एक पैरामीटर का मान की जाँच करने के है की तुलना में कार्रवाई करने के लिए महंगा हो रहा है? * यह वास्तव में क्या नहीं है गुण के लिए हैं। विशेषताएं मेटा डेटा के साथ सजाने वाले वर्गों, विधियों, गुणों और तर्कों के लिए हैं, वास्तव में स्वयं प्रसंस्करण करने के लिए नहीं। आपको अभी भी कॉलर या आपके फ़ंक्शन को वास्तव में शून्य की जांच करने की आवश्यकता होगी, इस स्थिति में केवल * शून्य * के लिए जांच करना आसान होगा। आपको स्वचालित रन-टाइम जांच नहीं मिल जाएगी। –

+1

'[FromUri]' संपत्ति केवल वैसे ही काम करती है क्योंकि कॉलर (जो कि वेब एपीआई स्वयं है) उस विधि के गुणों की जांच करता है, जिसे वह कॉल करने का प्रयास कर रहा है और यदि यह उस विशेषता को देखता है, तो यह मान से सम्मिलित करना जानता है uri। विशेषता स्वयं ऐसा नहीं करती है। यह कॉलर्स जिम्मेदारी है। प्रतिक्रिया के लिए –

उत्तर

3

निश्चित रूप से सबसे अधिक प्रदर्शन करने वाला नहीं है, लेकिन आप सही रास्ते पर हैं। यहां एक रैपर है जो आईएल में पोस्टशर्प क्या कर रहा है। यह वस्तुओं को पारित करने के लिए केवल अच्छा है, यह एक पैरामीटर के रूप में एक और विधि गुजरते समय टूट जाता है। हालांकि, उस समस्या को ठीक करना थोड़ा और काम है।

उत्पादन में मैं इसे एक प्रतिनिधि में प्रतिबिंब बनाने के लिए विस्तारित करूंगा जिसे मैं बाद में उपयोग के लिए कैश कर सकता हूं।

public class SomeClass 
{ 
    public void Method([NotNull] string Param1, [NotNull] string Param2) 
    { } 
} 

public static class SomeClassExtensions 
{ 
    public static void InvokeWithNullCheck<TObject>(this TObject obj, Expression<Action<TObject>> expression) 
    { 
     var body = (MethodCallExpression)expression.Body; 

     foreach(var parameter in body.Method.GetParameters()) 
     { 
      bool hasNotNullAttribute = parameter.CustomAttributes.Any(x => x.AttributeType.Equals(typeof(NotNullAttribute))); 
      if(hasNotNullAttribute && ((ConstantExpression)body.Arguments[parameter.Position]).Value == null) 
      { 
       throw new ArgumentException(String.Format("Mandatory parameter {0} was not supplied.", parameter.Name)); 
      } 
     } 

     expression.Compile()(obj); 
    } 
} 

[TestFixture] 
public class SomeClassTests 
{ 
    [Test] 
    public void Test() 
    { 
     var test = new SomeClass(); 
     Assert.Throws<ArgumentException>(() => test.InvokeWithNullCheck(x => x.Method(null, "Test"))); 
    } 
} 
+0

बस मैं क्या चाहता था, धन्यवाद! –

2

पोस्टशर्प पर एक नज़र डालें (देखें: http://www.postsharp.net)। यह उस तरह की कई विशेषताएं प्रदान करता है जैसे आप ढूंढ रहे हैं।

पोस्टशर्प एक प्रीकंपलर है जो आपके कोड में विशेषताओं को देखेगा और उचित कोड जैसे पैरामीटर सत्यापन उत्पन्न करेगा।

+0

@MartinMulder पोस्ट करने के लिए धन्यवाद। मैंने पोस्टशर्प को एक संभावित समाधान के रूप में सुना है, लेकिन मैं सोच रहा था कि क्या कोई अतिरिक्त सॉफ्टवेयर स्थापित किए बिना इसे मूल रूप से करने का कोई तरीका है। मैं दृश्य स्टूडियो 2013 में डिफ़ॉल्ट रूप से स्थापित किया गया है तक सीमित हूं। –

+0

तो ... एंटरप्राइज़ लाइब्रेरी एक विकल्प नहीं है? –

+0

पोस्टशर्प एंटरप्राइज़ लाइब्रेरी का हिस्सा है? यदि हां, तो यह संस्करण किस संस्करण से पेश किया गया था, क्योंकि हमारे पास एंटरप्राइज़ लाइब्रेरी 4. –

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