2013-10-04 4 views
7

पर एक प्रकार पैरामीटर के रूप में "गतिशील" कीवर्ड का उपयोग करने का पता लगाना मुझे संदेह है कि इस प्रश्न का संक्षिप्त उत्तर "नहीं" है, लेकिन मुझे सी # 4.0 में रनटाइम पर गतिशील कीवर्ड के उपयोग का पता लगाने की क्षमता में रूचि है, विशेष रूप से एक विधि के लिए एक सामान्य प्रकार पैरामीटर के रूप में।रनटाइम

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers) 
    where TResource : new() 
{ 
    var request = this.GetRequest(uri, headers); 
    return request.GetResponse<TResource>(); 
} 
:

कुछ पृष्ठभूमि देने के लिए, हम एक पुस्तकालय जो एक प्रकार है कि जब डी-serializing प्रतिक्रिया इस्तेमाल किया जाना चाहिए, जैसे निर्दिष्ट करने के लिए एक प्रकार पैरामीटर लेता है हमारी परियोजनाओं के एक नंबर के बीच साझा में एक RestClient वर्ग है

दुर्भाग्य से (कारणों से मैं ब्रेवटी के लिए यहां नहीं पहुंचूंगा) गतिशील प्रकार को वापस करने के लिए गति पैरामीटर के रूप में गतिशील का उपयोग करके ठीक से काम नहीं करता है - हमें एक दूसरा हस्ताक्षर जोड़ना पड़ा है एक गतिशील प्रतिक्रिया प्रकार वापस करने के लिए कक्षा:

public IRestResponse<dynamic> Get(Uri uri, IDictionary<string, string> headers) 
{ 
    var request = this.GetRequest(uri, headers); 
    return request.GetResponse(); 
} 

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

मूल रूप से या तो:

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers) 
    where TResource is not dynamic 

या

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers) 
    where TResource : new() 
{ 
    if (typeof(TResource).isDynamic()) 
    { 
      throw new Exception(); 
    } 

    var request = this.GetRequest(uri, headers); 

    return request.GetResponse<TResource>(); 
} 

इन बातों में से किसी के लिए संभव है? हम वीएस -2010 और नेट 4.0 का उपयोग कर रहे हैं, लेकिन भविष्य में संदर्भ के लिए मुझे .NET 4.5 समाधान में रुचि होगी यदि नई भाषा सुविधाओं का उपयोग करना संभव है।

+0

रनटाइम पर 'ट्रेशोर्स' केवल 'ऑब्जेक्ट' है जब उपयोगकर्ता 'गतिशील' निर्दिष्ट करता है। क्या उपयोगकर्ता कभी भी 'प्राप्त करने का प्रयास करेंगे? क्या उसे 'से अलग तरीके से संभालने की आवश्यकता है? –

+0

मैंने आपका शीर्षक संपादित किया है। कृपया देखें, "[प्रश्नों में उनके शीर्षक में" टैग "शामिल होना चाहिए?] (Http://meta.stackexchange.com/questions/19190/)", जहां आम सहमति है "नहीं, उन्हें नहीं करना चाहिए"। –

+0

@TimS। हाँ का उपयोग संभवतः ठीक है - मैं यह नहीं कहना चाहता कि अगर मुझे ... –

उत्तर

3

जब कोई Get<dynamic> चलाता है, रनटाइम TResourceobject पर होता है। जब तक Get<object> ऐसा कुछ नहीं है जो आपके उपयोगकर्ता वास्तव में करना चाहते हैं, तो आप जांच सकते हैं कि TResourceobject दोनों अप्रत्याशित मामलों (object और dynamic) को पकड़ने के लिए है या नहीं।

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers) 
    where TResource : new() 
{ 
    if (typeof(TResource) == typeof(object)) 
    { 
     throw new Exception("Use the dynamic one"); 
    } 

    var request = this.GetRequest(uri, headers); 

    return request.GetResponse<TResource>(); 
} 
+0

ऑब्जेक्ट की बजाय गतिशीलता के उपयोग का स्पष्ट रूप से पता लगाने का कोई तरीका है या नहीं, जैसा कि उपर्युक्त टिप्पणियों में उल्लेख किया गया है, मैं बहिष्कार से बचना चाहता हूं यदि संभव हो तो प्राप्त करें ... –