2013-07-19 87 views
4

是否有可能在C#中創建一個通用函數,其中第一個參數是一個枚舉(幾個中的一個,所以它必須是通用的,我猜),第二個參數被強制爲選擇的枚舉值作爲第一個參數?我明白泛型必須被使用,但我想不出如何編寫這樣一個表達式,或者甚至可能。通用函數,其中第二個參數首先取決於

編輯:添加代碼示例 我知道,此代碼示例不工作,但它說明了我在想的方向一點點。

public List<int> Call<EnumValue>(Type enumType, EnumValue enumValue) where EnumValue : Enum.GetValues(typeof(enumType)) 
{ 
    // Something  
} 
+5

你甚至不能約束一個泛型方法/類僅適用於枚舉。 –

+1

這就對了,我認爲你可以得到最接近的是: public void enumFunction (t enumObject) 其中t是枚舉類型,enumObject是它的一個實例。 – CurlyPaul

+0

你的意思是第一個參數必須是枚舉類型,第二個參數是該類型的值?或者你只是說這兩個參數都是相同枚舉類型的值? –

回答

4

我不認爲有這樣的編譯時間約束是可能的。你可以做的最好的是一個運行時檢查:

public List<int> Call<TEnum>(Type enumType, TEnum enumValue) 
{ 
    if(!enumType.IsAssignableFrom(typeof(TEnum))) 
     throw new ArgumentException(); 

    // Something 
} 

UPDATE:雖然我不知道爲什麼你需要通過Type,如果必須相同類型無論如何,其他參數。你不能擺脫第一個參數嗎?

public List<int> Call<TEnum>(TEnum enumValue) 
{ 
    Type enumType = typeof(TEnum); 

    // Something 
}  
+0

一個很好的解決方案,因爲它是不可能的,我的方式。非常感謝您的幫助。 – Ohlin

+0

@Ohlin替代解決方案在我的更新中。看看是否適合你。 –

+0

我的想法是傳遞該枚舉的枚舉和給定的默認值,但它可以是任何類型的枚舉。我要去嘗試你的解決方案。 – Ohlin

2

我覺得做類似的事情的唯一途徑是通過增加一個條件在函數內部,要麼返回的東西或者該參數是錯誤的(有明確的解釋)拋出異常。

+0

是的,這是我的備份計劃... – Ohlin