Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Метод, возвращающий разные типы данных C#

#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 List GetInitializedList(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 к примеру. Методы для возможности комбинировать несколько парсеров в один большой.

Комментариев нет:

Отправить комментарий