C# 返回一个列表<&燃气轮机;C语言中有源掩模的设计#

C# 返回一个列表<&燃气轮机;C语言中有源掩模的设计#,c#,C#,这是我正在处理的代码(我在网上找到了一些),我试图返回一个活动标志的列表。代码如下: 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;

这是我正在处理的代码(我在网上找到了一些),我试图返回一个活动标志的
列表。代码如下:

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;
        }
    }

我对C#还是个新手,有人能给我指出正确的方向吗?

标志需要是某种可枚举类型,你可能是指:

  public static List<T> GetActiveMasks<T>(ref IEnumerable<T> flags) 
          where T : struct {
        ...
    }
公共静态列表GetActiveMasks(参考IEnumerable标志)
其中T:struct{
...
}

您传入的
标志必须是
T
的集合,因为
T
结构
而不是集合

  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;
    }
公共静态列表GetActiveMasks(ref IEnumerable标志),其中T:struct{
返回的列表=新列表();
foreach(标记中的T值)
if(IsSet(标志、值))
返回。添加(值);
返回;
}

在您的示例中,
T
将替换为什么?这应该与具有
[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;
    }
publicstaticlist GetActiveMasks(reft标志),其中T:struct{
返回的列表=新列表();
foreach(Enum.GetValues(typeof(T)).Cast()中的T值)
if(IsSet(标志、值))
返回。添加(值);
返回;
}

现在,也就是说:注意,在许多这样的
enum
场景中,
enum
类型不仅有单独的标志,还有别名和/或组合标志。您的代码也会检测到这些设置。在你的问题中没有足够的上下文来知道这是否真的是一个问题,更不用说如何正确地解决它了。我只是简单地把它作为一个可能的“gotcha”,以防你不知道。

你不能迭代泛型类型。如果flags参数的类型为
List
,则可以对其进行迭代

public static List<T> GetActiveMasks<T>(ref List<T> flags) where T : struct 
publicstaticlist GetActiveMasks(ref-List标志),其中T:struct

这可能会有所帮助:枚举可以是长的,也可以是非长的,而不仅仅是int。您的代码是一种非常奇怪的方法,可以使这种事情变得通用。如果您选择此路径,请使用
ulong
支持较大的原语(现在,64位原语将使用此方法擦除其32个最高有效位)“System.Array”不包含“Cast”的定义,并且找不到接受“System.Array”类型第一个参数的扩展方法“Cast”(您是否缺少using指令或程序集引用?)(CS1061)-C:\Users\Christian\Documents\sharpdevelopment Projects\OblivionScripts\OblivionScripts\Common\BitMask.cs:36,49您需要将
using System.Linq;
包含在Linq扩展名的.cs文件中(如
Cast()
)也就是说,我只把它作为个人对代码清晰性的偏好;foreach
语句将隐式地(如果可能的话)为您转换,因此如果您愿意,您可以省略它。
public static List<T> GetActiveMasks<T>(ref List<T> flags) where T : struct