我有一个枚举的扩展方法
public static IEnumerable<T> GetFlags<T>(this T value) where T : struct
{
CheckIsEnum<T>(true);
foreach (T flag in Enum.GetValues(typeof(T)).Cast<T>())
{
if (value.IsFlagSet(flag))
yield return flag;
}
}
我试着得到这样的结果:
Zone_Status_ZoneConditionFlagEnum flags = (Zone_Status_ZoneConditionFlagEnum)flagsRaw;
List<Zone_Status_ZoneConditionFlagEnum> ZoneConditionFlags_List = (List<Zone_Status_ZoneConditionFlagEnum>)flags.GetFlags();
但是我得到了
NX584(NX584Test)->Error parsing message: Cannot implicitly convert type [Digicom.NX584Engine.Messages.Zone_Status_ZoneConditionFlagEnum] to System.Collections.Generic.List`1[Digicom.NX584Engine.Messages.Zone_Status_ZoneConditionFlagEnum].
答案 0 :(得分:2)
我不清楚为什么你会得到 错误 - 但你不能将GetFlags<T>
的结果转换为List<T>
,因为它不会返回List<T>
。最简单的解决方案是:
var ZoneConditionFlags_List = flags.GetFlags().ToList();
如果 不起作用,请提供新的错误消息。
或者,您可以更改GetFlags
,使其实际返回List<T>
而不是使用迭代器块。
答案 1 :(得分:1)
这里的第一个问题是序列与列表不同;如果您需要列表,返回列表,或在.ToList()
之后添加GetFlags()
,即
var ZoneConditionFlags_List = flags.GetFlags().ToList();
然而,更大的问题是您不能在该通用上下文中使用IsFlagSet
;该方法未针对任意T : struct
定义。
就我个人而言,我认为你最好只将其视为[Flags]
枚举;我假设您现有的代码需要列表而不是单个值?
答案 2 :(得分:0)
GetFlags
会返回IEnumerable<T>
,而不是List<T>
,您无法投射。
但是,您应该能够根据结果构建一个列表:
List<Zone_Status_ZoneConditionFlagEnum> ZoneConditionFlags_List = flags.GetFlags().ToList();
但是,错误与此处的代码完全不匹配,它应该抱怨IEnumerable无法强制转换,而是它表示枚举类型。你确定这是正确的代码吗?