嗨,在转到直接问题之前让我展示我的代码:
//Definition of enum
public enum LogType
{
Warning = -2,
Error = -1,
Info = 0,
EruCtorDtor = 1,
Notifications = 2,
CommunicationWithAOT = 4,
ExecutedOrder = 8,
ERUInfo = 16,
DebugLog = 32,
}
//Use of enum
CurrentLogFlagSettings = nLogFlag;
LogFlagMap = new SortedDictionary<LogType, int>();
ulong mask = 1;
while(mask <= nLogFlag)
{
if ((nLogFlag & mask) == mask)
{
LogType type = (LogType)mask; //Step 1
string val = type.ToString(); //Step 2
//Processing the value
LogFlagMap.Add(type, tempVal)
LogMsg(val + " added", type);
}
mask <<= 1;
}
我想要的是:仅在step1产生有效值后才处理step2。我的意思是值应该在枚举定义中定义的范围之间。否则我不想处理它。 例如
我想防止第二种情况被执行。我的问题有解决办法吗?
如果需要更多详细信息,请与我们联系。
答案 0 :(得分:4)
您可以使用Enum.IsDefined
,如下所示:
int value = 128;
Console.WriteLine(Enum.IsDefined(typeof(LogType), value)); // will print out False
答案 1 :(得分:3)
首先,让我严重道歉,我已经不喜欢睡觉,所以如果我错过了一点点。拜托,请忽略我。
您可以使用Enum.GetValues(typeof(LogType))枚举您的LogType,这样您就可以单步执行并检查一个值。我有一些代码,但是,我不能保证它已编译。
Bool isValid(int i)
{
foreach (LogType l in Enum.GetValues(typeof(LogType)))
{
if ((int)l == i) return true;
}
return false;
}
答案 2 :(得分:1)
您的代码的一个附加功能可能是为您枚举添加了[Flags]属性,这就清楚地表明枚举值是针对按位运算的
e.g。
[Flags]
public enum LogType
{
Warning = -2,
Error = -1,
Info = 0,
EruCtorDtor = 1,
Notifications = 2,
CommunicationWithAOT = 4,
ExecutedOrder = 8,
ERUInfo = 16,
DebugLog = 32,
}
虽然要执行此操作,但您需要更改值,以使警告和错误占据枚举值的前2位(假设仍然需要这样)。
c#Enum类也有方法GetName()。这可能提供了一种检索值集名称的简便方法
e.g。
Enum.GetName(typeof(LogType),4); // result = CommunicationWithAOT
答案 3 :(得分:1)
您还可以使用Enum.GetValues(typeof(LogType))来获取枚举的所有可能值,并通过它执行您想要的操作。
即
var values = Enum.GetValues(typeof (LogType));
foreach (LogType type in values)
{
if (((int)type & nLogMask) == (int)type)
{
//value is valid, process the value
}
}
答案 4 :(得分:0)
我有一个名为Unconstrained Melody的库,它允许您以类型安全的通用方式表达所有这些,并避免装箱。 个人我更喜欢使用Enum.IsDefined
,但显然不需要学习额外的库。
如果这是你需要对枚举进行的唯一操作,那么可能不值得使用Unconstrained Melody,但是如果你有其他类似的操作,你可能希望考虑它。