【发布时间】:2019-04-04 13:09:13
【问题描述】:
我想使用 .NET Standard 实现以下方法:
public static void SetFlag<TEnum>(ref TEnum value, TEnum flag)
where TEnum : Enum
我花了几个小时试图实现这一目标:
- 对于像
enums 这样的原始类型,通过反射 获取|运算符似乎是不可能的。 - 使用
dynamic需要引用一个额外的包 (Microsoft.CSharp.RuntimeBinder),但我希望我的库保持完全符合 .NET Standard。
我的最新想法是手动比较TEnum与的每个有效枚举类型{byte、sbyte、short、ushort、 int、uint、long、ulong}。但这感觉真的很奇怪和肮脏:
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(标准)在这里提供的唯一选项还是我缺少的选项?期待您的指点!
编辑:不是this question的重复;我正在使用 C# 7.3 和通用 Enum 约束。
【问题讨论】:
-
@Corak 我不这么认为,因为我使用的是
System.Enum约束。 -
是的,我刚刚意识到 - 我删除了我的评论!
-
@KnorxThieus - 是的,对不起。我完全预料到这是可能的。
-
我建议的副本具有功能通用的方法,可以对任何类型和基础大小的枚举执行各种按位运算,而无需装箱。请参阅琼斯医生的答案(优化了我的解决方案)。
标签: c# .net reflection enums .net-standard