2012-03-21 11 views
108

क्या इस विधि को सामान्य बनाने का कोई तरीका है ताकि मैं एक स्ट्रिंग, बूल, int, या डबल लौटा सकूं? अभी, यह एक स्ट्रिंग लौट रहा है, लेकिन अगर यह कॉन्फ़िगरेशन मान के रूप में "सत्य" या "गलत" पाता है, तो मैं उदाहरण के लिए एक बूल वापस करना चाहता हूं।मैं सामान्य विधि के रिटर्न प्रकार को कैसे बना सकता हूं?

public static string ConfigSetting(string settingName) 
    { 
     return ConfigurationManager.AppSettings[settingName]; 
    } 
+0

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

+2

मुझे लगता है कि आप वास्तव में पूछना चाहते हैं कि प्रश्न "मैं अपनी एप्लिकेशन कॉन्फ़िगरेशन को दृढ़ता से टाइप कैसे करूं?" यह बहुत लंबा रहा है क्योंकि मैंने इसके साथ उचित जवाब लिखने के लिए काम किया था। – Simon

+0

याहू, आदर्श रूप में मैं इस विधि में टाइप को पास नहीं करना चाहता हूं। मैं केवल 4 प्रकार का उल्लेख करने जा रहा हूं। तो अगर "true"/"गलत" सेट कर दिया जाता है, मैं इस समारोह (यह विधि में पारित करने के लिए की जरूरत के बिना) एक बूलियन वापस जाने के लिए, मैं शायद पूर्णांक को जोड़ सकते हैं और बस डबल में दोगुनी हो, और बाकी सब कुछ एक स्ट्रिंग होना चाहिए चाहते हैं। उत्तर दिया गया है कि पहले से ही ठीक काम करेगा, लेकिन मुझे हर बार टाइप पास करने की ज़रूरत है, जो शायद ठीक है। – MacGyver

उत्तर

234

आप इसे एक सामान्य विधि बनाने के लिए, इस तरह की जरूरत है:

public static T ConfigSetting<T>(string settingName) 
{ 
    return /* code to convert the setting to T... */ 
} 

लेकिन फोन करने वाले प्रकार वे उम्मीद करते हैं निर्दिष्ट करने के लिए होगा। इसके बाद आप संभवतः Convert.ChangeType इस्तेमाल कर सकते हैं, यह सोचते हैं कि सभी प्रासंगिक प्रकार समर्थित हैं:

public static T ConfigSetting<T>(string settingName) 
{ 
    object value = ConfigurationManager.AppSettings[settingName]; 
    return (T) Convert.ChangeType(value, typeof(T)); 
} 

मैं पूरी तरह आश्वस्त हैं कि यह सब एक अच्छा विचार है, मन आप ...

+10

/* कोड टी करने के लिए ... * सेटिंग परिवर्तित/और यहाँ पूरे उपन्यास इस प्रकार है :) –

+1

इस सेटिंग के प्रकार आप प्राप्त करना चाहते हैं, जो संभव नहीं हो सकता है कि आप की आवश्यकता नहीं होगी करने के लिए। – thecoshman

+0

@thecoshman: ठीक है ओ पी * अनुरोध किया * एक सामान्य विधि है, इसलिए है कि मैं क्या दे दिया है - लेकिन एक चेतावनी के साथ कि फोन करने वाले * * प्रासंगिक प्रकार जानने की आवश्यकता होगी। –

20

आप Convert.ChangeType() इस्तेमाल कर सकते हैं है नहीं कर रहा हूँ :

public static T ConfigSetting<T>(string settingName) 
{ 
    return (T)Convert.ChangeType(ConfigurationManager.AppSettings[settingName], typeof(T)); 
} 
-1
private static T[] prepareArray<T>(T[] arrayToCopy, T value) 
    { 
     Array.Copy(arrayToCopy, 1, arrayToCopy, 0, arrayToCopy.Length - 1); 
     arrayToCopy[arrayToCopy.Length - 1] = value; 
     return (T[])arrayToCopy; 
    } 

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

0

ऐसा करने के कई तरीके हैं (प्राथमिकता के आधार पर सूचीबद्ध, ओपी की समस्या के लिए विशिष्ट)

  1. विकल्प 1/सीधे दृष्टिकोण कर रहे हैं - प्रत्येक प्रकार के लिए अनेक कार्यों का बनाएं जैसा कि आप उम्मीद नहीं बल्कि एक सामान्य की तुलना में समारोह।

    public static bool ConfigSettingInt(string settingName) 
    { 
        return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]); 
    } 
    
  2. विकल्प 2/आप रूपांतरण की कल्पना तरीकों का उपयोग नहीं करना चाहते हैं जब - आपत्ति उठाने का मूल्य कास्ट और फिर सामान्य प्रकार है।

    public static T ConfigSetting<T>(string settingName) 
    { 
        return (T)(object)ConfigurationManager.AppSettings[settingName]; 
    } 
    

    नोट - यदि डाली मान्य (अपने मामले) नहीं है यह एक त्रुटि फेंक देते हैं। मैं अगर तुम प्रकार कास्टिंग के बारे में सुनिश्चित नहीं हैं, ऐसा करने की सिफारिश नहीं होगा, बल्कि विकल्प के लिए जाना 3.

  3. विकल्प 3/प्रकार सुरक्षा साथ जेनेरिक - जैसे रूपांतरण को संभालने के लिए एक सामान्य समारोह बनाएँ।

    public static T ConvertValue<T,U>(U value) where U : IConvertible 
    { 
        return (T)Convert.ChangeType(value, typeof(T)); 
    } 
    

    नोट - टी की उम्मीद प्रकार है, ध्यान दें यहाँ जहां बाधा (यू के प्रकार हमें त्रुटियों से बचाने के लिए IConvertible होना चाहिए)

+0

'यू' में तीसरा विकल्प जेनेरिक क्यों बनाते हैं? ऐसा करने में कोई बात नहीं है, और यह विधि को कॉल करने में कठोर बनाता है। बस इसके बजाय 'IConvertible' स्वीकार करें। मैं इसे इस सवाल यह देखते हुए कि यह जवाब नहीं देता प्रश्न पूछा जा रहा है के लिए दूसरा विकल्प सहित लायक है नहीं लगता। आपको शायद पहले विकल्प में विधि का नाम बदलना चाहिए ... –

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