2017-04-25 21 views
6

पर स्विच करना ऐसा लगता है कि यह वास्तव में आसान होना चाहिए, लेकिन मैं इसे काम करने के लिए एक रास्ता नहीं देख सकता।एक प्रकार परिवर्तनीय

Type propType = propertyInfo.PropertyType; 
switch (propType) 
{ 
    case typeof(byte): // Can't do this, 'A constant value is expected' 
    // Do something 
    break; 
} 

मैं भी

private const byteType = typeof(byte); 

कर रहे हैं और कि चालू करने की कोशिश की, लेकिन कोड की इस पंक्ति में एक ही कारण के लिए संकलित करने के लिए विफल रहता है।

तो, प्रश्न: मैं Type के उदाहरण को कैसे चालू करूं?

+0

क्या कोई कारण है जिसका आप उपयोग नहीं करना चाहते हैं/else? – Orangesandlemons

+0

क्या इससे सवाल है? @Orangesandlemons –

+2

इस समय मैं यही कर रहा हूं, लेकिन जब आपके पास लगभग 12 'और है, तो आप सोचना शुरू कर सकते हैं कि यह एक स्विच होना चाहिए। – Flynn1179

उत्तर

3

ठीक है, मेरा प्रारंभिक उत्तर गलत था। आप इसे एक प्रकार के स्विच में नहीं कर सकते (बिना when का उपयोग किए बिना, जो मेरी राय में इस उपयोग के लिए भयानक है)। समस्या यह है कि Type स्थिर नहीं है, इसलिए आप इसे स्विच में उपयोग नहीं कर सकते हैं।

मुझे गलत लगा क्योंकि आप वास्तविक मान का उपयोग नहीं कर रहे थे लेकिन Type उदाहरण थे। आपको if कथन का उपयोग करना जारी रखना होगा।

+0

दुर्भाग्य से, यह काम नहीं करता है। कंपाइलर 'प्रकार प्रकार की अभिव्यक्ति को प्रकार बाइट के पैटर्न द्वारा नियंत्रित नहीं किया जा सकता है' के साथ विफल रहता है। – Flynn1179

+0

@ Flynn1179 आप सही हैं, मेरे बुरे। –

+0

ठीक है, यह मुझे एक विचार देता है, जो काम करता है, लेकिन ... 'केस टाइप टी जहां टी == टाइपऑफ (बाइट) 'है, लेकिन मुझे लगता है कि यह वास्तव में एक दर्जन से अधिक वास्तविक लाभ नहीं दे रहा है अगर/अन्य बयान। – Flynn1179

2

आप switch साथ ऐसा कर सकते, तो आप सिर्फ एक var पैटर्न और when गार्ड उपयोग करने की आवश्यकता:

Type propType = propertyInfo.PropertyType; 
switch (propType) 
{ 
    case var b when b == typeof(byte): 
     // Do something 
     break; 
} 
0

आप Type पर switch के प्रयोग पर स्थापित कर रहे हैं, तो मुझे लगता है कि आप कुछ विकल्प हैं, दोनों काफी गरीब ।

पहला विकल्प TypeCode उपयोग करने के लिए है, उदा .:

switch (Type.GetTypeCode(propType)) 
{ 
    case TypeCode.Byte: 
    // Do something 
    break; 
} 

के बाद से यह केवल कुछ ही निर्मित प्रकार है कि the TypeCode enum में हैं का समर्थन करता है यह दृष्टिकोण काफी सीमित है।

एक अन्य विकल्प प्रकार नाम पर स्विच करने के लिए है: या तो

switch (propType.FullName) 
{ 
    case "System.Byte": 
    // Do something 
    break; 
} 

यह महान नहीं है, जब से तुम नाम स्थान सहित पूरा नाम लिखने के लिए, नाम गलत वर्तनी की जाँच नहीं की है और इस तरह के switch भी होगा "नकली" स्वीकार करें System.Byte प्रकार (यानि System.Byte नामक एक कस्टम प्रकार, नॉट में शामिल नहीं है)।

+1

@downvoter आपको क्या लगता है कि इस उत्तर में गलत है? – svick

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