我有一个为我的设计定义常量的类。例如以下内容:
public static class ObjectTypes
{
/// <summary>
/// The identifier for the ConfigurableObjectType ObjectType.
/// </summary>
public const uint ConfigurableObjectType = 2;
/// <summary>
/// The identifier for the FunctionalGroupType ObjectType.
/// </summary>
public const uint FunctionalGroupType = 4;
/// <summary>
/// The identifier for the ProtocolType ObjectType.
/// </summary>
public const uint ProtocolType = 5;
}
现在在我的代码中我已经为.eg valueInt计算了整数值,我想将valueInt与此类中定义的所有常量进行比较。有没有使用If-then-else块或切换大小写的快速方法,因为如果有大量的常量,这种方法将导致大的代码。某种可能的更好的方法是什么?我在C#工作。
注意:我不能改变上面提到的类的设计,因为我得到了一个预定义的类,例如来自一个库或由其他人设计的类,我无法改变,但我只能在我的代码中引用。
答案 0 :(得分:1)
可以使用反射。应该进行测试以确保它对你来说不会令人无法接受。
private static bool IsDefined(uint i) {
var constants = typeof(ObjectTypes).GetFields().Where(f => f.IsLiteral).ToArray();
foreach(var constant in constants) {
if(i == (uint)constant.GetRawConstantValue()) {
return true;
}
}
return false;
}
答案 1 :(得分:0)
虽然不是一个漂亮的构造,但是在不改变现有代码的情况下为给定问题提供可能的解决方案。
以下代码使用反射来比较
string fieldName = "not found";
uint testValue = 5;
Type t = typeof(ObjectTypes);
FieldInfo[] f = t.GetFields();
Array.ForEach<FieldInfo>(f, (info) => { if (testValue == (uint)info.GetValue(null)) fieldName = info.Name; });
并在代码末尾产生“ProtocolType”。
希望这有帮助,