#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");
}
}