Словарь как перечисление - PullRequest
1 голос
/ 19 января 2012

BasicTypes.xsd из схемы GML включает в себя следующее:

<simpleType name="SignType">
    <annotation>
        <documentation>
        gml:SignType is a convenience type with values "+" (plus) and "-" (minus).
        </documentation>
    </annotation>
    <restriction base="string">
        <enumeration value="-"/>
        <enumeration value="+"/>
    </restriction>
</simpleType>

Генератор кода (Sparx Enterprise Architect) генерирует следующее:

namespace OGC.GML.BasicTypes {
    /// <summary>
    /// gml:SignType is a convenience type with values "+" (plus) and "-" (minus).
    /// </summary>
    public enum SignType : int {
        -,
        +
    }
}

Конечно, я не могу иметь - и + в качестве ключей перечисления.Итак, мой вопрос:

Как бы я определил объект Dicionary для удовлетворения схемы как она есть?Или есть лучший способ? Пожалуйста, приведите пример кода.

Похоже, эти люди используют массив .

1 Ответ

1 голос
/ 19 января 2012

Вот пример того, как использовать словарь. Что в основном делает словарь, так это то, что он отображает один объект на другой, в данном случае, строка на int, вы всегда можете использовать разные типы для ключей и значений, если хотите.

        Dictionary<string, int> SignType = new Dictionary<string, int>();
        SignType.Add("-", 0);
        SignType.Add("+", 1);

        int plusValue = SignType["+"];

РЕДАКТИРОВАТЬ: я обновил его снова

Теперь вы можете использовать статический класс примерно так

namespace OGC.GML.BasicTypes
{
    public static class SignType
    {
        public static Dictionary<string, int> Values = new Dictionary<string, int>();
        static SignType()
        {
            Values.Add("-", 0);
            Values.Add("+", 1);
        }
    }
}

и вам нужно будет набрать OGC.GML.BasicTypes.SignType.Values["+"]

Или вы можете использовать экземпляр класса

    public class SignType
    {
        private static Dictionary<string, int> Values = new Dictionary<string, int>();
        public SignType()
        {
            Values.Add("-", 0);
            Values.Add("+", 1);
        }
        public int this[string s]
        {
            get { return Values[s]; }
        }
    }
}

, что позволит `new OGC.GML.BasicTypes.SignType () [" + "] '

и даже если BasicTypes является классом вместо пространства имен, в него все равно можно поместить больше Enums и Sub-Class, но это может быть не идеальным решением, в зависимости от назначения пространства имен.

...