c#方法返回3个可能的枚举中的一个
本文关键字:一个 枚举 3个 返回 方法 | 更新日期: 2023-09-27 18:10:37
我有以下三个枚举:
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
?更好的方法吗?
谢谢!
编辑
每种传感器类型都有多个传感器。
这看起来像是enumt . 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将在运行时知道,并且您可以询问返回值的类型以获得特定的答案)。
我将认真考虑包含A, B和C值的Enum SensorType
。然后,该函数可以根据传感器给出的响应类型返回一个明确的答案:
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;
}
现在,您可以从返回值本身知道传感器的类型。
您可以完全忽略问题的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");
}
}