2009-08-04 94 views
2

我在一個生成Command對象的類中有一個switch語句,它基於代碼文件中的某一行是否與該Command對象的特定代碼相匹配。在switch語句中使用屬性?

這樣的:

switch (line): 
{ 
    case "#CODE1": 
     return new Command1(); 
    case "#CODE2": 
     return new Command2(); 
} 

我想要把它弄成這個樣子:

switch (line): 
{ 
    case Command1.Code: 
     return new Command1(); 
    case Command2.Code: 
     return new Command2(); 
} 

我想它創建的Command一個公共靜態屬性,但是編譯器會抱怨...

有沒有辦法沿着這個意圖去做一些事情,編譯器不會抱怨?

回答

9

我認爲你只能用常量來做到這一點...所以如果可能的話,使用常量字段而不是公共靜態屬性。區別在於它在編譯時被視爲文字,因此如果該值發生更改,則需要重新編譯引用該常量的所有程序集。

2

切換僅適用於數字類型和字符串類型,不適用於屬性。你可以嘗試在你的Command1和Command2類上定義一個公共字符串常量,你應該可以改用它。

public class Command1 
{ 
    public string const Code = "#CODE1"; 
} 
1

,因爲你正在處理字符串我不知道這是否是最好的方法,但使用枚舉對我的作品

enum CommandEnum { CommandOne, ComandTwo, CommandN } 
//... 

CommandEnum myCommand; 
//... 
switch (myCommand) 
{ 
    case myCommand.CommandOne: 
     return new Command1(); 
    case myCommand.CommandTwo: 
     return new Command2(); 
    //... 
} 
0

我覺得你的問題是你需要在你面前來實例對象可以確定其屬性值。

我假設你有一個標記化指令代碼文件,如:

#CODE1 
#CODE2 

,你想一個類來讀取文件的每一行,然後執行指令爲準令牌定義。

你得到它的工作,而不是做一個直接的字符串比較文件中的令牌,你想要的對象的屬性中存儲的令牌的價值?該方法的問題在於,您必須先創建對象的新實例(命令1和2),然後才能引用其屬性值。

如果我明白你已經做了什麼以及你想做什麼,我認爲你的解決方案很好。我不是100%確定我真的明白你想要做什麼,或者爲什麼。

HTH

+0

我不喜歡讓字符串常量需要「記憶」。我希望他們連接到他們各自的命令。這種方式不可能出現拼寫錯誤。智能感知將抓住他們。 – 2009-08-04 20:31:22

+0

是的,但您的代碼文件中仍可能有拼寫錯誤。關鍵是要做你想做的事情,你必須首先實例化變量。在檢查屬性值後,您不能創建新實例,您必須先創建實例,然後才能檢查值。 – Beth 2009-08-05 16:59:28

0

如果你想檢查一個類的屬性。我假設你可能希望能夠改變這些屬性並相應地進行檢查。您將不得不使用if,else if,else if類型語句。

如果你有一個瓊斯使用switch語句,你是SOL,除非你正在檢查一個整數類型與常量值。如果,否則,如果塊是醜陋的,但它會做你想要的。

0

你總是可以依傍的嘗試和真正的if/else塊

if (line == Command1.Code) 
    return new Command1(); 
else if (line == Command2.Code) 
    return new Command2(); 

這不是那麼邪惡,是嗎?