Метод C # для возврата 1 из 3 возможных перечислений - PullRequest
0 голосов
/ 07 октября 2011

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

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? Лучший способ?

Спасибо!

EDIT

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

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

Это похоже на работу для Enum.TryParse ().

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 typeAresult;
   if(Enum.TryParse(responseCommand, typeAResult)) return typeAresult;
   SensorTypeB typeBresult;
   if(Enum.TryParse(responseCommand, typeBResult)) return typeBresult;
   SensorTypeC typeCresult;
   if(Enum.TryParse(responseCommand, typeCResult)) return typeCresult;
}

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

Я бы серьезно рассмотрел Enum 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 typeAresult;
   if(Enum.TryParse(responseCommand, typeAResult)) return SensorType.A;
   SensorTypeB typeBresult;
   if(Enum.TryParse(responseCommand, typeBResult)) return SensorType.B;
   SensorTypeC typeCresult;
   if(Enum.TryParse(responseCommand, typeCResult)) return SensorType.C;
}

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

0 голосов
/ 07 октября 2011

Вы можете полностью игнорировать часть вопроса 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");
        }
    }
...