Метод C # для возврата 1 из 3 возможных перечислений

#c# #methods #return-value

#c# #методы #возвращаемое значение

Вопрос:

У меня есть три следующих перечисления:

 public enum SensorTypeA{A1,A2,...,A12};
public enum SensorTypeB{B1,B2,...,B12};
public enum SensorTypeC{C1,C2,...,C12};
  

Я связываюсь со схемой датчика через последовательный порт и хочу узнать, какой датчик используется в местоположении «x», поэтому я создал метод

 public ???? GetSensorTypeAtLocation(int x)
{
   ...
   // Send serial command and receive response.
   string responseCommand = SendReceive(String.Format("SR,ML,{0},r", x));

   // Process response command string and return result.
   return ???? (could be any of the 3 possible enums)
}
  

Есть ли способ вернуть любое из возможных перечислений? Приведение к object ? Лучший способ?

Спасибо!

Редактировать

Для каждого типа датчиков существует несколько датчиков. Я изменил перечисления, чтобы отразить это.

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

1. А что, если значения перечислений перекрываются?

2. Почему существует три перечисления? Это разные типы датчиков?

3. Я не знаю, можете ли вы сделать это с перечислениями, я бы создал 3 класса, все производные от одного базового класса, и имел ClassA, ClassB и ClassC с общедоступным enum SensorType внутри.

4. общедоступный enum SensorType { A, B, C }

5. Да, это разные типы датчиков.

Ответ №1:

Это похоже на задание для Enum.Попробуйте выполнить синтаксический анализ().

 public Enum GetSensorTypeAtLocation(int x)
{
   ...
   // Send serial command and receive response.
   string responseCommand = SendReceive(String.Format("SR,ML,{0},r", x));

   //Try to parse the response into a value from one of the enums;
   //the first one that succeeds is our sensor type.
   SensorTypeA typeAresu<
   if(Enum.TryParse(responseCommand, typeAResult)) return typeAresu<
   SensorTypeB typeBresu<
   if(Enum.TryParse(responseCommand, typeBResult)) return typeBresu<
   SensorTypeC typeCresu<
   if(Enum.TryParse(responseCommand, typeCResult)) return typeCresu<
}
  

Проблема будет заключаться в том, что вы не можете создавать перегрузки на основе возвращаемого типа, и поэтому вы не будете точно знать, что вернет система (но среда CLR будет знать во время выполнения, и вы можете запросить тип возвращаемого значения, чтобы получить конкретный ответ).

Я бы серьезно рассмотрел перечисление SensorType , содержащее значения A, B и C. Затем функция может вернуть определенный ответ, основанный на том, какой тип ответа дал датчик:

 public SensorType GetSensorTypeAtLocation(int x)
{
   ...
   // Send serial command and receive response.
   string responseCommand = SendReceive(String.Format("SR,ML,{0},r", x));

   // Process response command string and return result.
   SensorTypeA typeAresu<
   if(Enum.TryParse(responseCommand, typeAResult)) return SensorType.A;
   SensorTypeB typeBresu<
   if(Enum.TryParse(responseCommand, typeBResult)) return SensorType.B;
   SensorTypeC typeCresu<
   if(Enum.TryParse(responseCommand, typeCResult)) return SensorType.C;
}
  

Теперь вы знаете из самого возвращаемого значения, простого как день, тип датчика.

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

1. Я думаю, что я соглашусь с вашим первым предложением. Я немного упростил сообщение, из перечислений два являются типами датчиков, а один — «типом вычисления». Этот тип вычисления — ADD, SUB, … где ADD может быть равно SensorTypeA.A12 SensorTypeB.2 или какой-либо другой комбинации. Из-за этого мне придется опрашивать во время выполнения, но это не должно быть слишком болезненным. Спасибо!

Ответ №2:

Вы можете полностью игнорировать Enum часть вопроса, потому что корень вопроса таков: «Может ли функция возвращать несколько типов». Ответ на это «да», но в этом случае вам придется вернуть класс более высокого уровня Object , и вам нужно будет выполнить проверку типа после возврата:

     public enum SensorTypeA { A = 0 };
    public enum SensorTypeB { B = 1 };
    public enum SensorTypeC { C = 2 };

    private object GetSensorTypeAtLocation()
    {
        return SensorTypeB.B;
    }

    private void YourMethod(object sender, EventArgs e)
    {
        object value = GetSensorTypeAtLocation();
        if (value is SensorTypeA)
        {
            Console.WriteLine("A");
        }
        else if (value is SensorTypeB)
        {
            Console.WriteLine("B");
        }
        else if (value is SensorTypeC)
        {
            Console.WriteLine("C");
        }
        else
        {
            Console.WriteLine("Unknown");
        }
    }