【问题标题】:How to create extension method on enumeration (c#)如何在枚举上创建扩展方法(c#)
【发布时间】:2013-03-11 13:53:55
【问题描述】:

我想创建一个扩展方法,该方法将通过其键返回一个枚举值。 用法将是

LifeCycle.GetLifeCycle(1) 

或 LifeCycle.GetLifeCycleByValue("")

这就是我的想法 - 假设我有以下枚举:

public enum LifeCycle
{
    Pending = 0,
    Approved = 1,
    Rejected = 2,
}

我为 getByint 案例编写了以下扩展

public static class EnumerationExtensions
{
    private static Dictionary<int, LifeCycle> _lifeCycleMap = Enum.GetValues(typeof(LifeCycle)).Cast<int>().ToDictionary(Key => Key, value => ((LifeCycle)value));

    public static LifeCycle GetLifeCycle(this LifeCycle lifeCycle, int lifeCycleKey)
    {
        return _lifeCycleMap[lifeCycleKey];
    }
}

到目前为止

 LifeCycle.GetLifeCycle(1) 

不编译。

这可能吗?

【问题讨论】:

  • 其实你可以不写代码直接使用var foo = (LifeCycle)1;。不是很满意吗?
  • @Jon 不同之处在于,如果你给它一个无效的值,它会正常工作,而不是抛出异常。这可能是可取的,也可能是不可取的。
  • @Servy:当然。但是您可以编写一个EnsureValid(this LifeCycle lc) 方法,如果Enum.HasValue(lc.GetType(), lc)false,如果这是问题所在。
  • 这是一般情况。我也希望能够做到这一点。我会尽快更新问题

标签: c# enums extension-methods


【解决方案1】:

没有静态扩展方法之类的东西,而这正是您想要做的。您只能创建作用于类型实例而非类型本身的扩展方法。

【讨论】:

    【解决方案2】:

    LifeCycle 是类型而不是该枚举的实例。

    所以这会编译:

    LifeCycle.Pending.GetLifeCycle(1);
    

    但是这个扩展无论如何都是没有意义的,因为你可以直接通过它的int 值获得一个枚举:

    LifeCycle approved = (LifeCycle) 1;
    

    【讨论】:

      【解决方案3】:

      你只需要像这样投射:

      var lifeCycle = (LifeCycle)1;
      

      举个例子:

      using System;
      
      namespace Test
      {
          class Program
          {
              static void Main(string[] args)
              {
                  var lifeCycle = (LifeCycle)1;
                  Console.WriteLine(lifeCycle);
                  //Output: Approved
              }
          }
      
          public enum LifeCycle
          {
              Pending = 0,
              Approved = 1,
              Rejected = 2,
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-10-19
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 1970-01-01
        • 2023-04-10
        相关资源
        最近更新 更多