Istnieje kilka wątków na zakresach wartości w wyliczeniach (nie jest to możliwe). Ale mam następujący problem i szukam najlepszego rozwiązania, w którym żaden z podanych mi produktów naprawdę mnie nie zadowalał.C# alternatywa do wyliczenia dla relacji n: m
Specyfikacja protokółu mówi, że bajt [x] z komunikatu, typu komunikatu, posiada następujące możliwe wartości (wartości Fantasy):
0x00 = get
0x01 = set
0x02 to 0xFF = identify
więc istnieje tylko 3 Warianty logicznych, co najlepiej radzić sobie w wyliczaniu. Ale jedna z n opcji logicznych ma m różne odpowiedniki numeryczne, których nie można rozpatrywać w wyliczeniu.
Jakie jest najlepsze (najczystsze) rozwiązanie tego problemu? mógłbym zbudować klasę
class MessageType {
public enum MessageTypeEnum {
get = 0x00,
set = 0x01,
identify = 0x02
}
public static MessageTypeEnum getLogicalValue (byte numericalValue)
{
if (numericalValue < 0x02)
return (MessageTypeEnum(numericalValue));
else
return MessageTypeEnum.identify;
}
}
mogę również utworzyć klasę bez wyliczenia, ale z członków statycznych.
czy inaczej jest jeden problem: Jeśli ktoś próbuje wysyła pakiet, może on wykorzystać
if (messageBytes[x] == (byte)MessageTypeEnum.identify) {
// do stuff
}
Ale messageByte [x] może być coś między 0x02 a 0xFF, więc „trafienia” wartość podaną w enum byłoby czystym szczęściem. Z drugiej strony chcę, aby enum (lub statyczny członek) był jawny dla łatwego budowania wiadomości.
Czy mogę w jakiś sposób wymusić użycie mojej funkcji getLogicalValue()? Czy istnieje bardziej eleganckie rozwiązanie?
Wszystko, czego chcę, to łatwy i dobrze zorganizowany sposób łączenia wartości logicznych z wartościami liczbowymi w relacji n: m. Szczególnie, że dany protokół ma wiele takich przypadków i chciałabym zachować porządek w swoim kodzie.
Dzięki za pomoc i czasu :)
Janis
Przypuszczam, że masz na myśli 'messageBytes [x] == (byte) ...' zamiast '=', co byłoby zadaniem. Nigdy nie można w pełni uniemożliwić innym osobom rzucania jednym typem do drugiego (chyba że przesłonimy operatora obsady i wyrzucimy wyjątek). Jeśli ktoś chce nadużywać twojego kodu, zrobi to. – Krumelur
Tak, naprawdę miałem na myśli "==". Ten błąd przydarzy mi się, gdy pochodzę z innych języków i bezpośrednio wpisałem kod w oknie komentarza. Co do nadużywania kodu: Chodzi o to, że sam mógłbym popełnić ten błąd podczas korzystania z pliku .dll, który chcę zbudować, ponieważ Enums (zwykle) są funkcją dwukierunkową (wartość logiczna <=> wartość liczbowa) – Janis