2012-11-27 53 views
1

我有兩個枚舉器和一個採用枚舉器的方法。它們被稱爲ABC和DEF,並且該方法被稱爲TestMethod(Enum myEnum)。代碼如下:確定枚舉類型

public enum ABC 
{ 
    Zero, 
    One, 
    Two 
}; 

public enum DEF 
{ 
    Zero, 
    One, 
    Two 
}; 

public void TestEnum(Enum myEnum) 
{ 
    ... 
} 

函數TestEnum接受任何枚舉器。我如何測試兩個參數中的哪一個屬於?我可以盲目地開始用try/catch鑄造測試它,但是看起來醜陋。任何更乾淨的方法呢?預先感謝您的任何幫助。

回答

6

我該如何測試兩個參數中哪一個參數屬於?

您只需調用GetType

Type type = myEnum.GetType(); 

目前尚不清楚你想要什麼後做有了它,你要知道。

或者:

if (myEnum is ABC) 
{ 
} 
else if (myEnum is DEF) 
{ 
} 

編輯:如果你能夠改變方法簽名如果你的來電者知道的類型,然後按葉普的評論,你可以使用:

public void TestEnum<T>(T value) where T : struct 
{ 
    // Use typeof(T) here 
} 

您不能將T約束爲具有普通C#的枚舉類型......儘管有編寫代碼的hacky ways,但通過後處理應用了此類約束。

+1

耶穌喬恩,我甚至不能接受你的答案再過12分鐘。在我發佈之前,你是否讀過我的想法並寫出來?大聲笑。我會盡快給你一個複選標記,謝謝你的閃電般的快速反應,以及爲這樣一個愚蠢的小問題編寫小程序。< – Lukas

+0

@Lukas你也可以讓你的方法成爲通用的。這就像這樣:'public void TestEnum (TEnum myEnum)其中TEnum:struct {/ *方法體在這裏* /}'。這避免了拳擊。例如,您可以使用'typeof(TEnum)'來獲得類型。與此問題是,C#語言目前不允許您將類型參數「TEnum」限制爲...枚舉。 –

+0

@JeppeStigNielsen:我會添加該選項。 (我認爲方法簽名是固定的。)你可能也想看看我的Unconstrained Melody庫:) https://code.google.com/p/unconstrained-melody/ –

1

斯基特先生已經釘了這個,但!

兩種方法呢?

public void TestEnum(ABC abcEnum) { 
    //do ABC stuff 
} 

public void TestEnum(DEF defEnum) { 
    //do DEF stuff 
} 

你得到了你需要的分支,但不必擔心獲得if語句的權利。真的,它只是一個if語句,但如果你添加枚舉GHI。現在有一些未被記錄的TestEnum處理輸入。使用重載的方法,你可以在編譯時捕捉到(甚至更好,intellisense會抓住你)。

+0

有很多正確的答案,儘管我喜歡和使用喬恩的我會給你一個觀點,因爲它是正確的。 – Lukas