2012-10-25 75 views
0

如何將枚舉傳遞爲方法的參數之一?我只需要在該方法的某些實現中,而不是在其他實現中。這就是方法聲明的樣子:在參數中傳遞枚舉

public abstract void SomeMethod(params object[] someParams); 

這就是我想一些實現看:

public override void SomeMethod(params object[] someParams) { 

    SomeEnum someEnum = someParams[0]; 
    if (someEnum == null) 
     return; 

} 

此代碼,當然是無效的,但它表明什麼我打算做。該方法的其他實現可能使用其他枚舉,或根本不使用枚舉。

更新:正如很多人所說,這是一件非常奇怪的事情,把類型安全扔到了窗外。所以,我決定解釋我爲什麼要這樣做。

我必須將方法調用傳遞給類的很多不同的子類,我通過一個通過網絡(以及本地)發送它們的系統聲明此方法,並在特定時間以特定順序執行它們。有一個更好的方法嗎?

回答

4
public override void SomeMethod(params object[] someParams) 
{ 
    if (!(someParms[0] is SomeEnum)) 
     return; 

    var se = (SomeEnum) someParams[0]; 
    ... 
} 

雖然相當你爲什麼想要通過顯式類型參數做到這一點,我無法想象。

3

您可以像使用其他任何對象一樣使用params關鍵字來傳遞類型的枚舉值。

public override void SomeMethod(params SomeEnum[] someEnums) 
{ 
    foreach(SomeEnum e in someEnums) 
    { 

    } 
} 

如果你必須通過其他枚舉,以及這種方法,你可以使用System.Enum爲參數,因爲所有枚舉從中獲得。打字有點強。

public override void SomeMethod(params Enum[] enums) 
{ 
    //something like 
    var @enum = enums[0]; 
    if (!(@enum is SomeEnum)) 
     return; 

    var someEnum = (SomeEnum)@enum; 
} 

至於承認你的編輯,最好的方法是指定你要明確方法調用過程中傳遞作爲方法的簽名的對象。只有在您傳遞的參數數量必須可變時,您才應該依賴params關鍵字。否則,你應該堅持顯式聲明簽名。如果您的枚舉SomeEnum是可選的,那麼您最後可以將其聲明爲可選參數。像這樣:

public override void SomeMethod(int a, string b, SomeEnum? someEnum = null) 
{ 
    if (someEnum == null) 
     //handle the logic here 
} 
2

那麼它看起來像你真的在這裏要求麻煩,基本上從簽名中刪除任何強類型。你需要施放。

其次,類型SomeEnum的值不能爲空,因爲枚舉是值類型。所以,你可能

public override void SomeMethod(params object[] someParams) 
{ 
    if (someParams[0] == null) 
    { 
     return; 
    } 
    // This will throw an exception if you've been given the wrong kind 
    // of argument. I prefer that to just silently returning, as it would 
    // usually indicate a programming error which should be fixed. 
    SomeEnum someEnum = (SomeEnum) someParams[0]; 
    ...  
} 

但是,你會更好的工作了代表一個更強類型的方式的參數的方式。不幸的是,如果沒有更多信息,我們無法真正幫助您做到這一點

+0

我要傳遞的方法通過將它們發送跨網絡(系統調用以及本地)並在特定時間以特殊順序執行它們。有一個更好的方法嗎? (在問題中包含此評論)。 –

1

我想通常你會使用重載方法的不同實現,而不是覆蓋,如果他們需要不同的參數。這些可能仍然有PARAMS底:

void M(SomeEnum someEnum, params object[] someParams) 
{ 
    //... 

你的代碼可能與此簽名的工作也一樣,但是:

public override void SomeMethod(params object[] someParams) { 

    if (someParams.Length == 0 or !(someParams[0] is SomeEnum)) 
     return; 

    SomeEnum someEnum = (SomeEnum)someParams[0]; 
    //...