【问题标题】:Passing enum in params在参数中传递枚举
【发布时间】:2012-10-15 22:18:23
【问题描述】:

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

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

这就是我希望某些实现看起来的样子:

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

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

}

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

更新: 正如许多人所说,这是一件非常奇怪的事情,将类型安全抛到了窗外。所以,我决定解释一下我这样做的原因。

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

【问题讨论】:

    标签: c# enums params


    【解决方案1】:

    您可以使用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];
          ...    
      }
      

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

      【讨论】:

      • 我必须通过一个系统传递方法调用,该系统通过网络(以及本地)发送它们并在特定时间以特殊顺序执行它们。有一个更好的方法吗? (在问题中包含此评论)。
      【解决方案3】:
      public override void SomeMethod(params object[] someParams)
      {
          if (!(someParms[0] is SomeEnum))
              return;
      
          var se = (SomeEnum) someParams[0];
          ...
      }
      

      虽然我无法想象您为什么要对显式类型的参数执行此操作。

      【讨论】:

        【解决方案4】:

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

        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-07-31
          • 2012-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多