我有一个包含多个标志的 XML,其中一些是无符号 32 位整数,另一些是无符号 64 位整数。其中一些以逗号分隔的列表形式编写,而另一些则以十六进制形式编写。
看这个例子:
<Color>Blue,Red</Color>
<Color>0xC</Color>
因为我不想编写一个方法来解析每个枚举,所以我决定使用通用方法。但是 Visual Studio 不允许我构建解决方案。这是我的方法:
public static T ParseFlags<T>(string value) where T : struct
{
T result = (T)((object)0);
string[] array;
// Remove white spaces and delimit string if it is comma-separated
if (ParseDelimitedString(value, ',', out array))
{
for (int i = 0; i < array.Length; i++)
{
T flag = (T)((object)0);
// Check if value is member of enumeration
if (Enum.TryParse<T>(array[i], out flag))
{
result |= (T)((object)flag);
}
}
}
else
{
switch (Type.GetTypeCode(Enum.GetUnderlyingType(typeof(T))))
{
// Remove hex characters and parse node's inner text
case TypeCode.UInt32:
result = (T)((object)ParseUint(value));
break;
case TypeCode.UInt64:
result = (T)((object)ParseUlong(value));
break;
}
}
return result;
}
我得到的错误信息是:
Error 1 Operator '|=' cannot be applied to operands of type 'T' and 'T'
有办法吗?
最佳答案
您正在做很多可以为您完成的工作。例如,如果您的 enum
是使用 FlagsAttribute
声明的,那么 Enum.Parse
将为您解析逗号分隔值。
public static T ParseFlags<T>(string value) where T : struct
{
T result;
ulong temp;
if (Enum.TryParse(value, out result))
{
return result;
}
string hexNum = value.StartsWith("0x") ? value.Substring(2) : value;
if (ulong.TryParse(hexNum, NumberStyles.HexNumber, null, out temp))
{
return (T)Enum.ToObject(typeof(T), temp);
}
throw new ArgumentException("value could not be parsed");
}
我使用具有 short
、int
和 ulong
后备值的各种 Flags 枚举类型对此进行了测试。
关于c# - 从逗号分隔的列表或整数中解析枚举标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180291/