2017-04-25 54 views
6

Bu gerçekten çok kolay olması gerektiğini düşünüyor, ancak bunun işe yaraması için bir yol göremiyorum. Bir tür değişkeni üzerinde geçiş yapma

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

Ben de

private const byteType = typeof(byte); 

yapıyor ve bu konuda geçiş çalıştı, ancak bu kod satırı aynı nedenle derlenmeyecektir.

Yani, soru: Type örneğini nasıl açabilirim?

+0

Kullanmak istemediğiniz bir neden var mı/else? – Orangesandlemons

+0

Sorunun önemi var mı? @Orangesandlemons –

+2

Şu anda yaptığım şey bu, ama 12 'ye sahip olduğunuzda, belki de bunun bir anahtar olması gerektiğini düşünmeye başlıyorsunuz. – Flynn1179

cevap

3

Tamam, ilk yanıtım yanlıştı. Bunu bir tür anahtarda yapamazsınız (when'u belirtildiği şekilde kullanmadan, bu kullanım için bence çok kullanışlıdır). Sorun şu ki, Type sabit değil, bu yüzden bunu bir anahtarda kullanamazsınız.

Hatalıydım çünkü gerçek değeri kullanmıyorsunuz, ancak bir Type örneği. if ifadelerini kullanmaya devam etmeniz gerekir. Sen switch ile yapabilirsiniz

+0

Maalesef, bu işe yaramıyor. Derleyici, 'Türün bir ifadesi, bir tür bayt deseniyle işlenemez' ile başarısız olur. – Flynn1179

+0

@ Flynn1179 Haklısın, kötüyüm. –

+0

Eh, bana bir fikir verdi, hangi işe yarıyor, ama ... 'durumda t tipi t == typeof (byte)' t yazın, ama bu gerçekten bir düzine üzerinde herhangi bir gerçek yarar sağlamadığını hissediyorum başka ifadeler. – Flynn1179

2

, sadece bir var desen ve when bekçi kullanmak gerekir:

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

Eğer Type üzerinde switch kullanılarak ayarlanır, ben, sen kaç seçenek var hem oldukça kötü düşünmek .

ilk seçenek TypeCode kullanmaktır, ör .:

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

o yerleşik the TypeCode enum olan türleri sadece birkaç destekler çünkü bu yaklaşım, son derece sınırlıdır.

Diğer bir seçenek tipi adını geçmek şudur: ad dahil, isim yazım hataları için kontrol edilmez tam adı yazmak zorunda çünkü, ya

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

Bu büyük değil ve bu tür switch da olur "Sahte" System.Byte türünü (örn. System.Byte adlı özel bir tür, .Net'de bulunanı değil) kabul edin.

+1

@downvoter Bu cevapta neyin yanlış olduğunu düşünüyorsunuz? – svick