2011-10-07 52 views
0

我有三個以下枚舉1:C#方法返回的3個可能的枚舉

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

存在用於每個傳感器類型的多個傳感器。我改變了枚舉來反映這一點。

+1

如果什麼枚舉值重疊? –

+1

爲什麼有三個枚舉?他們是不同類型的傳感器? – ChrisF

+0

我不知道你是否可以用enums做到這一點,我會創建3個類都來源於相同的基類,並有ClassA,ClassB和ClassC與公共枚舉SensorType裏面。 –

回答

2

這看起來像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會知道在運行時,你可以詢問的類型返回值以獲得特定答案)。

我會認真考慮包含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; 
} 

現在,你從返回值本身知道,平原爲一天,傳感器的類型。

+0

我想我會與你的第一個建議。我簡化了這篇文章,列舉了兩種傳感器類型,一種是「計算類型」。該計算類型爲ADD,SUB,...,其中ADD可以等於SensorTypeA.A12 + SensorTypeB.2或其他組合。因此,我將不得不在運行時進行詢問,但這不應該太痛苦。謝謝! – john

0

完全可以忽略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"); 
     } 
    }