如何在.NET Standard中为通用枚举类型设置枚举标志?

诺克斯·蒂乌斯

我想使用.NET Standard实现以下方法:

public static void SetFlag<TEnum>(ref TEnum value, TEnum flag)
    where TEnum : Enum

我花了几个小时来尝试实现这一目标:

  • 对于原始类型,像s这样|通过反射获取操作员似乎是不可能enum的。
  • 使用dynamic需要引用一个额外的包(Microsoft.CSharp.RuntimeBinder),但我希望我的库保持纯净的.NET Standard一致性。

我最近的想法是手动比较 TEnum每个有效枚举类型的{bytesbyteshortushortintuintlongulong}但这感觉真的很奇怪又肮脏:

try
{
    var v = (byte)(object)value | (byte)(object)flag;
    value = (TEnum)(object)v;
    return;
}
catch (InvalidCastException) { }

try
{
    var v = (int)(object)value | (int)(object)flag;
    value = (TEnum)(object)v;
    return;
}
catch (InvalidCastException) { }

// ...

throw new NotSupportException($"Unknown enum type {typeof(TEnum)}");

那么,这真的是.NET(标准)在此提供的唯一选项吗?还是我所缺少的?期待您的提示!

编辑:不是这个问题的重复我正在使用C#7.3和通用Enum约束。

广州7

它不是最便宜的(所有东西都装箱了,有些反射,等等),但是您总是可以做这样的事情:

private static void SetFlag<T>(ref T value, T flag) where T : Enum
{
    // 'long' can hold all possible values, except those which 'ulong' can hold.
    if (Enum.GetUnderlyingType(typeof(T)) == typeof(ulong))
    {
        ulong numericValue = Convert.ToUInt64(value);
        numericValue |= Convert.ToUInt64(flag);
        value = (T)Enum.ToObject(typeof(T), numericValue);
    }
    else
    {
        long numericValue = Convert.ToInt64(value);
        numericValue |= Convert.ToInt64(flag);
        value = (T)Enum.ToObject(typeof(T), numericValue);
    }
}

您仍然有一些重复,但至少限于long/ulong如果可以假设您的flags枚举成员没有负值,则可以使用:

private static void SetFlag<T>(ref T value, T flag) where T : Enum
{
    ulong numericValue = Convert.ToUInt64(value);
    numericValue |= Convert.ToUInt64(flag);
    value = (T)Enum.ToObject(typeof(T), numericValue);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在.NET Standard中为通用枚举类型设置枚举标志?

来自分类Dev

如何在 .Net MVC Core 中将枚举显示为 DropDownList

来自分类Dev

如何在迁移 Laravel 5 中设置枚举类型的长度

来自分类Dev

在Simulink中如何使用.Net枚举?

来自分类Dev

如何在使用NLua运行的脚本中对.NET枚举执行按位或运算?

来自分类Dev

如何在C#中为枚举值添加描述以与ASP.NET MVC中的下拉列表一起使用?

来自分类Dev

如何在C ++ 11中定义通用枚举?

来自分类Dev

如何在Java代码中传递通用枚举键

来自分类Dev

如何使用通用枚举类型调用GetEnumName?

来自分类Dev

如何在枚举C#中为同一定义设置两个值

来自分类Dev

如何使用枚举标志?

来自分类Dev

如何在golang中枚举?

来自分类Dev

如何在 VS2013 中为 VB.NET 设置最小和目标 .NET 框架

来自分类Dev

枚举:如何为枚举类型的类成员设置值?

来自分类Dev

如何将通用枚举传递给方法并将其设置为方法内部的动态对象

来自分类Dev

如何在ASP.NET MVC4中为Web API网址创建通用方法

来自分类Dev

如何在asp.net MVC4中为Web API网址创建通用方法

来自分类Dev

如何从ASP.NET MVC中的枚举创建下拉列表?

来自分类Dev

如何从VB.NET枚举中获取描述?

来自分类Dev

如何在rust中访问复杂枚举类型的元素?

来自分类Dev

如何在实体框架中删除强制转换枚举类型

来自分类Dev

如何在python中定义C枚举类型

来自分类Dev

如何在laravel迁移中更改枚举类型列?

来自分类Dev

如何在T4模板中获取枚举类型

来自分类Dev

如何在Postgres中获取枚举数据类型的AVG?

来自分类Dev

如何在rust中访问复杂枚举类型的元素?

来自分类Dev

如何在 Delphi 中检查枚举的 IStorage 元素的类型?

来自分类Dev

如何在pyalsaaudio中设置混合器枚举值?

来自分类Dev

如何在.NET中将StreamWriter的源设置为多个?

Related 相关文章

  1. 1

    如何在.NET Standard中为通用枚举类型设置枚举标志?

  2. 2

    如何在 .Net MVC Core 中将枚举显示为 DropDownList

  3. 3

    如何在迁移 Laravel 5 中设置枚举类型的长度

  4. 4

    在Simulink中如何使用.Net枚举?

  5. 5

    如何在使用NLua运行的脚本中对.NET枚举执行按位或运算?

  6. 6

    如何在C#中为枚举值添加描述以与ASP.NET MVC中的下拉列表一起使用?

  7. 7

    如何在C ++ 11中定义通用枚举?

  8. 8

    如何在Java代码中传递通用枚举键

  9. 9

    如何使用通用枚举类型调用GetEnumName?

  10. 10

    如何在枚举C#中为同一定义设置两个值

  11. 11

    如何使用枚举标志?

  12. 12

    如何在golang中枚举?

  13. 13

    如何在 VS2013 中为 VB.NET 设置最小和目标 .NET 框架

  14. 14

    枚举:如何为枚举类型的类成员设置值?

  15. 15

    如何将通用枚举传递给方法并将其设置为方法内部的动态对象

  16. 16

    如何在ASP.NET MVC4中为Web API网址创建通用方法

  17. 17

    如何在asp.net MVC4中为Web API网址创建通用方法

  18. 18

    如何从ASP.NET MVC中的枚举创建下拉列表?

  19. 19

    如何从VB.NET枚举中获取描述?

  20. 20

    如何在rust中访问复杂枚举类型的元素?

  21. 21

    如何在实体框架中删除强制转换枚举类型

  22. 22

    如何在python中定义C枚举类型

  23. 23

    如何在laravel迁移中更改枚举类型列?

  24. 24

    如何在T4模板中获取枚举类型

  25. 25

    如何在Postgres中获取枚举数据类型的AVG?

  26. 26

    如何在rust中访问复杂枚举类型的元素?

  27. 27

    如何在 Delphi 中检查枚举的 IStorage 元素的类型?

  28. 28

    如何在pyalsaaudio中设置混合器枚举值?

  29. 29

    如何在.NET中将StreamWriter的源设置为多个?

热门标签

归档