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 ?更好的方法吗?

谢谢!

编辑

每种传感器类型都有多个传感器。

c#方法返回3个可能的枚举中的一个

这看起来像是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");
        }
    }