#c_sharp
Есть буфер в котором находится много значений переменных.Переменные записаны последовательно следующей структурой: сначала идет идентификатор типа данных(больше 20 вариантов), длинна данных и собственно сами данные. Вот в таком виде я примерно хочу получить ответ от метода (Код естественно не рабочий). public var AnsParse(byte[] Array) { switch (Array[0]) { case 1: { int rezult = Array[2]; break; } case 2: { bool rezult = Array[2]; break; } } return rezult; } Есть ли возможность обойти это?
Ответы
Ответ 1
Все объекты в C# наследники типа object, по этому вы можете использовать вместо var object. А вообще я рекомендую вам воспользоваться generic'ами. Использовать их можно например так: class Program { static ListGetInitializedList (T value, int count) { // This generic method returns a List with ten elements initialized. // ... It uses a type parameter. // ... It uses the "open type" T. List list = new List (); for (int i = 0; i < count; i++) { list.Add(value); } return list; } static void Main() { // Use the generic method. // ... Specifying the type parameter is optional here. // ... Then print the results. List list1 = GetInitializedList(true, 5); List list2 = GetInitializedList ("Perls", 3); foreach (bool value in list1) { Console.WriteLine(value); } foreach (string value in list2) { Console.WriteLine(value); } } } Ответ 2
Если вы хотите выдавать в качестве результата объекты разных типов, можете воспользоваться типом dynamic: public dynamic AnsParse(byte[] Array) { switch (Array[0]) { case 1: return 1; // возвращаем число case 2: return false; // возвращаем булевое значение } return "no result"; // возвращаем строку } Однако нужно быть аккуратным: поскольку фактический тип возвращаемого значения определяется во время исполнения, то попытка использовать возвращаемое значение неподходящим для фактического типа образом приведет к исключению во время выполнения программы.Ответ 3
ASN.1 парсер реализован на C# в библиотеке BouncyCastle. Посмотрите, как сделано там. Я бы определил метод так: public static T RunParser(Parser parser, byte[] data) { // code } Ну или если угодно: public abstract class Parser { public T RunOnBytes(byte[] data) { // code } } public sealed class IntegerParser: Parser { public BigInteger RunOnBytes(byte[] data) { if (readTag(data) != Asn1Tags.Integer) throw new InvalidTagMetException(); var placement = readDataPlacement(data); var octets = readDataOctets(data, placement.Offset, placement.Length); return BigInteger(octets.Reverse()); } } Импрувменты, которые нужны: Заменить data[] на BinaryReader (или свою имплементацию, в которой определны хелпер-методы чтения), потому что нужно двигаться по массиву данных, откатываться назад в случае неверного кейса choice к примеру. Методы для возможности комбинировать несколько парсеров в один большой.
Комментариев нет:
Отправить комментарий