传递枚举的枚举

时间:2012-10-25 16:57:49

标签: c# enums params

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

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

这就是我希望看到的一些实现的方式:

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

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

}

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

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

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

4 个答案:

答案 0 :(得分:4)

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

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

虽然你想要在隐式类型参数上做这个,但我无法想象。

答案 1 :(得分: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 :(得分: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];
    ...    
}

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

答案 3 :(得分: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];
    //...