[英]Bitmask'ed Int to Enum[] or Int[]? c#
我有一個看起來像這樣的枚舉:
enum foo{
a=0,
b=1,
c=2,
d=4
}
構建標志/位掩碼很好,但可以做類似的事情
int i = 3;
var bar = Enum.Split(foo,i);
導致像
bar = foo[]{a, b,c};
謝謝。
請嘗試以下方法
public static IEnumerable<T> Split<T>(int value) {
foreach (object cur in Enum.GetValues(typeof(T))) {
var number = (int)(object)(T)cur;
if (0 != (number & value)) {
yield return (T)cur;
}
}
}
有了這個你現在可以寫
int i = 3;
IEnumerable<foo> e = Split<foo>(i);
注意:這僅適用於從int
派生的enum
值(默認設置)。 它也不是完全類型安全的,因為T
不能僅限於enum
值(盡管如此)無關緊要
[FlagsAttribute]
允許您提取所有有效值。
http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx
嘗試這個:
TEnum[] EnumSplit<TEnum>(int mask)
{
List<TEnum> values = new List<TEnum>();
foreach(int enumValue in Enum.GetValues(typeof(TEnum)))
{
if(mask & enumValue == enumValue)
values.Add((TEnum)enumValue);
}
return values.ToArray();
}
像這樣稱呼它:
var bar = EnumSplit<foo>(i);
最好,您希望將其更改為返回IEnumerable<TEnum>
而不是TEnum[]
。
您可以使用從您傳遞的Enum
提取值的方法來執行此操作:
public static T[] EnumSplit<T>(int value) where T : struct
{
// Simplified as Enum.GetValues will complain if T is not an enum
// However, you should add a check to make sure T implements FlagAttribute
return (from vv in Enum.GetValues(typeof(T))
where ((int)vv & value) != 0
select (T)vv).ToArray();;
}
var flags = Enum.GetValues(typeof (/* YourEnumType */))
.Cast</* YourEnumType */>()
.Select(v => enumValue.HasFlag(v))
.ToArray();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.