在 C# 中扩展枚举

发布于 2024-08-10 07:27:10 字数 294 浏览 2 评论 0原文

我想知道是否可以扩展 C# 中的 Enum 类型来实现我的自定义 Enum.GetValues(type) 并像 Enum.GetMyCustomValues(type) 那样调用它

我正在尝试实现这样的东西:

public static bool IsFlagSet<T>(this T value, T flag) where T : Enum
{
    return (value & flag) != (T)0;
}

但它无法完成.. 。 我能做些什么? 干杯

I was wondering whether or not I can extend the Enum type in C# to implement my custom Enum.GetValues(type) and call it like Enum.GetMyCustomValues(type)

I am trying to implement something like this:

public static bool IsFlagSet<T>(this T value, T flag) where T : Enum
{
    return (value & flag) != (T)0;
}

but it cannot be done...
any work arounds I can do?
Cheers

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

骄兵必败 2024-08-17 07:27:10

扩展适用于实例,而不是创建静态方法。您可以使用 public static void MyExtensions(this Enum value) 扩展基本 Enum。但这仍然只会在您创建的 Enum 实例上创建方法。添加静态方法(就像您在类外部讨论的那样)的唯一方法是该类是分部类。

编辑:为了做你想做的事情,我写了以下

public static bool IsFlagSet<T>(this Enum value, Enum flag)
{
    if (!typeof(T).IsEnum) throw new ArgumentException();
    if (value == flag) return true;
    return ((int)Enum.Parse(typeof(T), value.ToString()) &
        (int)Enum.Parse(typeof(T), flag.ToString())) != 0;
}

*警告,这种方法在使用之前需要仔细考虑,我希望有更好的方法来做到这一点。

Extensions work on instances, not for creating static methods. You can extend the base Enum using public static void MyExtensions(this Enum value). But this would still only create methods on Enum instances you create. The only way to add static methods like you're talking about externally for a class is if the class is a partial class.

Edit: to do something like you want I wrote the following

public static bool IsFlagSet<T>(this Enum value, Enum flag)
{
    if (!typeof(T).IsEnum) throw new ArgumentException();
    if (value == flag) return true;
    return ((int)Enum.Parse(typeof(T), value.ToString()) &
        (int)Enum.Parse(typeof(T), flag.ToString())) != 0;
}

*warning, this method needs to be thought out more prior to use, I'm hoping there is a better way to do it.

删除会话 2024-08-17 07:27:10

我认为您可能正在寻找枚举的扩展方法。
这是一个起始链接:< a href="http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx" rel="nofollow noreferrer">http://pietschsoft.com/post/2008 /07/C-Enhance-Enums-using-Extension-Methods.aspx

I think you may be looking for extension methods for enums.
Here's a starting link: http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx

一刻暧昧 2024-08-17 07:27:10

还有一个例子。

    public static bool Includes<T>(this T value, T flag) where T : struct, IConvertible
    {
        var val = value.ToUInt32(null);
        var fl = flag.ToUInt32(null);
        return (val & fl) == fl;
    }

以及用法。

SomeEnum val = SomeEnum.One;
bool isOne = val.Includes(SomeEnum.One); // == true
bool isTwo = val.Includes(SomeEnum.Two); // == false

And one more example.

    public static bool Includes<T>(this T value, T flag) where T : struct, IConvertible
    {
        var val = value.ToUInt32(null);
        var fl = flag.ToUInt32(null);
        return (val & fl) == fl;
    }

And the usage.

SomeEnum val = SomeEnum.One;
bool isOne = val.Includes(SomeEnum.One); // == true
bool isTwo = val.Includes(SomeEnum.Two); // == false
も让我眼熟你 2024-08-17 07:27:10

这是我能想到的最好的测试。请记住,枚举可以基于 64 位整数:

 public static bool IsFlagSet(this Enum value, Enum flag)
 {
     if (Type.GetTypeHandle(value).Value != Type.GetTypeHandle(flag).Value)
         throw new ArgumentException();
     return (Convert.ToInt64(value) & Convert.ToInt64(flag)) != 0L;
 }

Here's test best I could think of. Remember that enums could be based on 64 bit ints:

 public static bool IsFlagSet(this Enum value, Enum flag)
 {
     if (Type.GetTypeHandle(value).Value != Type.GetTypeHandle(flag).Value)
         throw new ArgumentException();
     return (Convert.ToInt64(value) & Convert.ToInt64(flag)) != 0L;
 }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文