快速搜索类成员(const int,const string等)

时间:2013-11-12 20:19:48

标签: c# object-oriented-analysis

我有一个为我的设计定义常量的类。例如以下内容:

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#工作。

注意:我不能改变上面提到的类的设计,因为我得到了一个预定义的类,例如来自一个库或由其他人设计的类,我无法改变,但我只能在我的代码中引用。

2 个答案:

答案 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”。

希望这有帮助,