2009-11-14 5 views
8

मैं एक साधारण सामान्य समारोह बनाना चाहते हैंसी #: "बाहर" के साथ सामान्य विधि का उपयोग कैसे करें चर

void Assign<T>(out T result) 
{ 
    Type type = typeof(T); 
    if (type.Name == "String") 
    { 
    // result = "hello"; 
    } 
    else if (type.Name == "Int32") 
    { 
    // result = 100; 
    } 
    else result = default(T); 
} 

उपयोग:

int value; 
string text; 

Assign(value); // <<< should set value to 100 
Assign(text); // <<< should set text to "hello" 

मेरा प्रश्न है कि कैसे आप कोड कार्यक्रम है स्थापित करने के लिए है ये मूल्य यानी। टिप्पणी खंड में गायब कोड।

किसी भी मदद के लिए धन्यवाद।

उत्तर

16

ऐसा लगता है कि आप इस मामले में मुक्केबाजी से बचने के लिए ऐसा कर रहे हैं? मुश्किल में अधिक जानकारी के बिना कहने के लिए है, लेकिन इस विशिष्ट उदाहरण के लिए, यह बहुत आसान हो जाएगा और शायद कम बग की आशंका वाले को सिर्फ विधि से अधिक भार का उपयोग करें:

void Assign(out string value) 
{ 
    //... 
} 

void Assign(out int value) 
{ 
    //... 
} 

विशेष रूप से सीखने के प्रयोजनों के लिए क्या यहाँ गलत है , आप सामान्य प्रकार के लिए यह कास्टिंग से पहले एक वस्तु के लिए एक मूल्य कास्ट करने के लिए की आवश्यकता है:

(T)(object)"hello world!"; 

कौन सा IMO बहुत बुरा है और एक अंतिम उपाय होना चाहिए - निश्चित रूप से अपने कोड किसी भी क्लीनर नहीं है।

जब भी आप जेनेरिक पैरामीटर की टाइप-जांच करते हैं, तो यह एक अच्छा संकेत जेनरिक आपकी समस्या का सही समाधान नहीं है। जेनेरिक पैरामीटर प्रकार चेक करने से आपके कोड को अधिक जटिल, सरल नहीं होता है। यह एक विधि को विभिन्न तरीकों के लिए ज़िम्मेदार बनाता है, बजाय एकल विधियों की एक श्रृंखला की बजाय जो दूसरों को गलती से प्रभावित किए बिना बदलना आसान होता है। Single Responsibility Principle देखें।

0

यहाँ एक तरीका है:

static void Assign<T>(out T result) { 
    Type type = typeof(T); 
    if (type.Name == "String") { 
     result = (T)Convert.ChangeType("hello", typeof(T)); 
    } 
    else if (type.Name == "Int32") { 
     result = (T)Convert.ChangeType(100, typeof(T)); 
    } 
    else { 
     result = default(T); 
    } 
} 

लेकिन इस कोड वास्तव में बदबू आती है और जेनरिक के बिंदु के खिलाफ जाता है (बजाय अतिभारित विधियों का उपयोग करें)। मुझे उम्मीद है कि यह उत्पादन कोड में कहीं खत्म नहीं होगा और केवल संपादन के लिए है।

+0

धन्यवाद एक बहुत; यह काम। कारण मैं सामान्य दृष्टिकोण का उपयोग कर रहा हूं, मेरा कोड सरल बनाना है। क्योंकि "असाइन कोड" केवल एक विशिष्ट प्रकार (उदाहरण के लिए स्ट्रिंग) के लिए आवश्यक है; वहां हर संभव प्रकार के लिए अधिभारित कार्यों को बनाना बुरा होगा। परिणाम = डिफ़ॉल्ट (टी) // सामान्य व्यवहार –

+7

मैं आपसे सहमत नहीं हूं। मुझे लगता है कि ओवरलोडिंग बिल्कुल इसके लिए है। आवश्यकता होने पर केवल जेनरिक का प्रयोग करें। – Sheldon

3

सबसे पहले यह एक बहुत खराब पैटर्न है। आपको इस तरह के पैटर्न का उपयोग नहीं करना चाहिए। हो सकता है कि यदि आप वर्णन करते हैं कि आप वास्तव में क्या हासिल करना चाहते हैं तो बेहतर जवाब होंगे।

नीचे दिए गए कोड काम करते हैं, लेकिन जैसा कि मैंने कहा कि कोड लिखना इस तरह एक बुरा विचार है।

void Assign<T>(out T result) 
    { 
     Type type = typeof(T); 
     if (type.Name == "String") 
     { result = (T) ((object)"hello"); } 
     else if (type.Name == "Int32") 
     { result = (T) ((object)100); } 
     else result = default(T); 
    } 

और उपयोग:

 int value; 
     string text; 

     Assign(out value); 
     Assign(out text); 
1
public T GetObject<T>(string val) 
{ 
    T _object = default(T); 
    _object = (T)Convert.ChangeType(val, typeof(T)); 
    return _object; 
} 
संबंधित मुद्दे