返回列表<> C#中的活动掩码

时间:2015-05-06 21:41:37

标签: c#

这是我正在处理的代码(我在网上找到了一些代码),我正在尝试返回活跃的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#的新手。

4 个答案:

答案 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的集合,因为Tstruct而非集合。

  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