2017-04-25 40 views
6

To wydaje się być bardzo proste, ale po prostu nie widzę sposobu, aby to zadziałało.Włączanie zmiennej typu

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

Próbowałem też robi

private const byteType = typeof(byte); 

i włączeniu, ale ta linia kodu nie skompilować z tego samego powodu.

Tak, pytanie: Jak włączyć instancję Type?

+0

Czy jest jakiś powód, którego nie chcesz używać, jeśli/else? – Orangesandlemons

+0

Czy to ma znaczenie dla pytania? @Orangesandlemons –

+2

To właśnie robię w tej chwili, ale kiedy masz około 12 "innych, jeśli", zaczniesz myśleć, że może to być zmiana. – Flynn1179

Odpowiedz

3

Dobra, moja początkowa odpowiedź była błędna. Nie można tego zrobić w przełączniku typu (bez użycia when, jak wskazano, co jest okropne dla tego użycia w mojej opinii). Problem polega na tym, że Type nie jest stałą, więc nie można jej użyć w przełączniku.

Myliłem się, ponieważ nie używasz rzeczywistej wartości, ale instancję Type. Musisz nadal używać instrukcji if.

+0

Niestety, to nie działa. Kompilator kończy się niepowodzeniem z wyrażeniem typu Typ nie może być obsługiwane przez wzorzec typu bajta. – Flynn1179

+0

@ Flynn1179 Masz rację, moje zło. –

+0

Cóż, dało mi to jeden pomysł, który działa, ale ... 'case Type t gdzie t == typeof (byte)', ale wydaje mi się, że to nie daje żadnej realnej korzyści od kilkunastu, jeśli/inne instrukcje. – Flynn1179

2

Można to zrobić z switch, wystarczy użyć var wzór i when Strażnik:

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

Jeśli jesteś ustawiony na użyciu switch na Type, myślę, że masz kilka opcji, zarówno dość słaba .

Pierwszą opcją jest użycie TypeCode, np .:

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

Takie podejście jest poważnie ograniczona, ponieważ obsługuje tylko kilka wbudowanych typów, które są w the TypeCode enum.

Innym rozwiązaniem jest przejście na nazwę typu:

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

To nie jest też wspaniała, ponieważ trzeba napisać pełną nazwę w tym obszarze nazw, nazwa nie jest sprawdzana pod kątem literówek i takie switch również zaakceptuj "fałszywy" typ System.Byte (tj. niestandardowy typ o nazwie System.Byte, a nie ten zawarty w .Net).

+1

@downvoter Jak sądzisz, co jest złego w tej odpowiedzi? – svick