1

如何将枚举作为方法的参数之一传递?我只需要在该方法的某些实现中,而在其他实现中不需要。这就是方法声明的样子:

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

这就是我希望一些实现的样子:

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

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

}

当然,这段代码是无效的,但它显示了我打算做什么。该方法的其他实现可以使用其他枚举,或者根本不使用枚举。

更新:正如许多人所说,这是一件非常奇怪的事情,将类型安全扔出窗外。所以,我决定解释我为什么要这样做。

我必须将方法调用传递给一个类的许多不同子类,我通过一个系统声明这个方法,该系统通过网络(以及本地)发送它们并在特定时间以特殊顺序执行它们。有一个更好的方法吗?

4

4 回答 4

4

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
}
于 2012-10-25T17:01:04.577 回答
4
public override void SomeMethod(params object[] someParams)
{
    if (!(someParms[0] is SomeEnum))
        return;

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

尽管我无法想象您为什么要通过显式类型的参数来执行此操作。

于 2012-10-25T17:01:43.440 回答
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];
    ...    
}

但是,您最好找出一种以更强类型的方式表示参数的方法。不幸的是,如果没有更多信息,我们无法真正帮助您做到这一点。

于 2012-10-25T17:01:42.833 回答
1

我认为通常你会为方法的不同实现使用重载,而不是覆盖,如果它们需要不同的参数。这些最后仍然可能有参数:

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];
    //...
于 2012-10-25T17:04:14.137 回答