这是我正在处理的代码(我在网上找到了一些代码),我正在尝试返回活跃的List<>
个标志。这是代码:
public static class BitMask {
public static bool IsSet<T>(T flags, T flag) where T : struct {
int flagsValue = (int)(object)flags;
int flagValue = (int)(object)flag;
return (flagsValue & flagValue) != 0;
}
public static void Set<T>(ref T flags, T flag) where T : struct {
int flagsValue = (int)(object)flags;
int flagValue = (int)(object)flag;
flags = (T)(object)(flagsValue | flagValue);
}
public static void Unset<T>(ref T flags, T flag) where T : struct {
int flagsValue = (int)(object)flags;
int flagValue = (int)(object)flag;
flags = (T)(object)(flagsValue & (~flagValue));
}
public static List<T> GetActiveMasks<T>(ref T flags) where T : struct {
List<T> returned = new List<T>();
foreach(T value in flags)
if(IsSet(flags, value))
returned.Add(value);
return returned;
}
}
但是,我遇到了这个问题:
foreach statement cannot operate on variables of type 'T' because 'T' does not contain a public definition for 'GetEnumerator' (CS1579) - C:\Users\Christian\Documents\SharpDevelop Projects\OblivionScripts\OblivionScripts\Common\BitMask.cs:36,4
有人可以请我朝着正确的方向推动我,因为我还是C#的新手。
答案 0 :(得分:1)
在您的示例中,T
将替换为什么?这应该适用于具有enum
属性的[Flags]
吗?
如果是这样,那么你应该能够通过编写这样的方法来使代码工作:
public static List<T> GetActiveMasks<T>(ref T flags) where T : struct {
List<T> returned = new List<T>();
foreach(T value in Enum.GetValues(typeof(T)).Cast<T>())
if(IsSet(flags, value))
returned.Add(value);
return returned;
}
现在,它说:请注意,在许多此类enum
方案中,enum
类型不仅包含单独的标志,还包含别名和/或组合标志。您的代码会将这些代码检测为&#34; set&#34;同样。在您的问题中没有足够的上下文来了解这是否真的是一个问题,更不用说如何正确地解决它。我只是提到它是一种可能的&#34;陷阱&#34;,以防万一你不知道。
答案 1 :(得分:0)
flags
需要是一些可枚举的类型,你可能意味着:
public static List<T> GetActiveMasks<T>(ref IEnumerable<T> flags)
where T : struct {
...
}
答案 2 :(得分:0)
您传入的flags
必须是T
的集合,因为T
是struct
而非集合。
public static List<T> GetActiveMasks<T>(ref IEnumerable<T> flags) where T : struct {
List<T> returned = new List<T>();
foreach(T value in flags)
if(IsSet(flags, value))
returned.Add(value);
return returned;
}
答案 3 :(得分:0)
您无法迭代泛型类型。如果flags参数的类型为List<T>
,则您可以对其进行迭代。
public static List<T> GetActiveMasks<T>(ref List<T> flags) where T : struct