Click here to Skip to main content
15,894,180 members
Articles / Programming Languages / C#

Enumeration-based Command Line Utility

Rate me:
Please Sign up or sign in to vote.
4.99/5 (49 votes)
14 May 2017CPOL19 min read 98.1K   925   101  
An example the application of Enumeration class, third article of the series
/*
    Enumeration demo:
    Generic class Enumeration provides iteration capabilities based on enumeration or any other type with static fields;
    Generic class EnumerationIndexedArray implements enumeration-indexed arrays
    
    Copyright (C) 2008-2010 by Sergey A Kryukov
    http://www.SAKryukov.org
*/

using System;
using System.Windows.Forms;

namespace EnumerationDemo {
    using SA.Universal.Enumerations;
    using Real = System.Double;

    public partial class FormEnumerationDemo {

        void AssignButtons() {
            AddButton("Source &Declarations").Click += delegate(object sender, EventArgs e) { ShowSource(); };
            AddButton("Test &Enumeration").Click += delegate(object sender, EventArgs e) { Clear(); TestEnumeration(); };
            AddButton("Test &Human-readable Strings").Click += delegate(object sender, EventArgs e) { Clear(); TestHumanReadable(); };
            AddButton("Test &Arrays").Click += delegate(object sender, EventArgs e) { Clear(); TestArrays(); };
            AddButton("Test Non-&Iterated Array Index\n(will raise exception)").Click += delegate(object sender, EventArgs e) { Clear(); TestNonIteratedArrayIndex(); };
            AddButton("Test Non-&Unique Array Index").Click += delegate(object sender, EventArgs e) { Clear(); TestNonIteratedNonArrayIndexWithNonUniqueValue(); };
        } //AssignButtons

        void ShowSource() {
            ShowDeclarationSourceCode();
        } //ShowSource

        void TestEnumeration() {
            Enumeration<Status> statusEnumeration = new Enumeration<Status>();
            Enumeration<double> doubleEnumeration = new Enumeration<double>();
            Enumeration<int> intEnumeration = new Enumeration<int>();
            Type underlyingIntegerType = Enum.GetUnderlyingType(typeof(Status));
            WriteLine();
            WriteLine("StatusEnumeration:");
            foreach (EnumerationItem<Status> item in statusEnumeration) {
                object intValue = Convert.ChangeType(item.EnumValue, underlyingIntegerType);
                WriteLine("\t{0}={1}={2}", item.Name, item.EnumValue, intValue);
            } //loop
            WriteLine();
            WriteLine("StatusEnumeration in Reverse:");
            statusEnumeration.IsReverse = true;
            foreach (EnumerationItem<Status> item in statusEnumeration) {
                object intValue = Convert.ChangeType(item.EnumValue, underlyingIntegerType);
                WriteLine("\t{0}={1}={2}", item.Name, item.EnumValue, intValue);
            } //loop
            WriteLine();
            WriteLine("DoubleEnumeration:");
            foreach (EnumerationItem<double> item in doubleEnumeration)
                WriteLine("\t{0}={1}", item.Name, item.Value);
            WriteLine();
            WriteLine("IntEnumeration:");
            foreach (EnumerationItem<int> item in intEnumeration)
                WriteLine("\t{0}={1}", item.Name, item.Value);
            WriteLine(); WriteLine();
        } //TestEnumeration

        void TestHumanReadable() {
            WriteLine();
            Enumeration<StringOption> stringOptions = new Enumeration<StringOption>();
            Enumeration<BitsetOptions> bitsetOptions = new Enumeration<BitsetOptions>();
            foreach (EnumerationItem<StringOption> item in stringOptions) {
                WriteLine(" {0:}", item.Name);
                WriteLine("\tDisplay Name: \"{0}\"", item.DisplayName);
                WriteLine("\tDescription: \"{0}\"", item.Description);
                WriteLine();
            } //loop StringOption
            foreach (EnumerationItem<BitsetOptions> item in bitsetOptions) {
                WriteLine(" {0:}", item.Name);
                WriteLine("\tDisplay Name: \"{0}\"", item.DisplayName);
                WriteLine("\tDescription: \"{0}\"", item.Description);
                WriteLine();
            } //loop StringOption
            for (int underlyingIntegerValue = 0; underlyingIntegerValue < 10; underlyingIntegerValue++)
                WriteLine("(BitsetOptions){0}: {1}", underlyingIntegerValue, StringAttributeUtility.GetDisplayName((BitsetOptions)underlyingIntegerValue));
        } //TestHumanReadable

        void TestArrays() {
            Enumeration<Status> statusEnumeration = new Enumeration<Status>();
            EnumerationIndexedArray<Status, int> IntArray = new EnumerationIndexedArray<Status, int>();
            EnumerationIndexedArray<Status, string> StringArray = new EnumerationIndexedArray<Status, string>();
            foreach (EnumerationItem<Status> item in statusEnumeration)
                StringArray[item.EnumValue] = @"""" + item.EnumValue.ToString() + @" string""";
            foreach (EnumerationItem<Status> item in statusEnumeration)
                IntArray[item.EnumValue] = item.GetHashCode();
            WriteLine("String Array:");
            foreach (EnumerationItem<Status> item in statusEnumeration)
                WriteLine("\tStringArray[{0}] = {1}", item.Name, StringArray[item.EnumValue]);
            WriteLine();
            statusEnumeration.IsReverse = true;
            WriteLine("Int Array, in reverse:");
            foreach (EnumerationItem<Status> item in statusEnumeration)
                WriteLine("\tIntArray[{0}] = {1}", item.Name, IntArray[item.EnumValue]);
            WriteLine(); WriteLine();
        } //TestArrays

        void TestNonIteratedArrayIndex() {
            EnumerationIndexedArray<Status, string> StringArray = new EnumerationIndexedArray<Status, string>();
            Status index = Status.Redundant;
            StringArray[index] = index.ToString();
            WriteLine("{0} enum member is ignored by Enumeration", index);
            WriteLine("Trying to access array by this index: {0}", StringArray[index].ToString());
        } //TestNonIteratedArrayIndex

        void TestNonIteratedNonArrayIndexWithNonUniqueValue() {
            EnumerationIndexedArray<Status, string> StringArray = new EnumerationIndexedArray<Status, string>();
            Status index = Status.NonUnique;
            string realEnumMemberName = "NonUnique"; //there is not access to this name
            StringArray[index] = index.ToString();
            WriteLine("{0} enum member is ignored by Enumeration", realEnumMemberName);
            WriteLine("Trying to access array by this index: {0}", StringArray[index].ToString());
            WriteLine();
            WriteLine("Compare values:");
            WriteLine("\t{0} = {1}", StringArray[index], (int)index);
            WriteLine("\t{0} = {1}", realEnumMemberName, (int)Status.NonUnique);
            WriteLine(); WriteLine();
        } //TestNonIteratedNonArrayIndexWithNonUniqueValue

    } //class FormEnumerationDemo

} //namespace EnumerationDemo

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect
United States United States
Physics, physical and quantum optics, mathematics, computer science, control systems for manufacturing, diagnostics, testing, and research, theory of music, musical instruments… Contact me: https://www.SAKryukov.org

Comments and Discussions