简体   繁体   中英

enum name with multiple values

In my project i'm using enums example:

public enum NcStepType { Start = 1, Stop = 3, Normal = 2 }

i'm reading values from a database, but sometimes there are 0-values in my record, so i want an enum that looks like

public enum NcStepType { Start = 1 OR 0, Stop = 3, Normal = 2 }

is this possible (in c#) ?

No, basically. You would have to give it one of the values (presumably the 1), and interpret the other (0) manually.

No it is not, and I'm not sure how it would work in practice.

Can't you just add logic that maps 0 to 1 when reading from the DB?

Normally i define in such cases the 0 as follows:

public enum NcStepType
{
    NotDefined = 0,
    Start = 1,
    Normal = 2,
    Stop = 3,
}

And somewhere in code i would make an:

if(Step == NcStepType.NotDefined)
{
    Step = NcStepType.Start;
}

This makes the code readable and everyone knows what happens... (hopefully)

You could create a generic extension method that handles unknown values:

    public static T ToEnum<T>(this int value, T defaultValue)
    {
        if (Enum.IsDefined(typeof (T),value))
            return (T) (object) value;
        else
            return defaultValue;
    }

Then you can simply call:

int value = ...; // value to be read

NcStepType stepType = value.ToEnum(NcStepType.Start);

// if value is defined in the enum, the corresponding enum value will be returned
// if value is not found, the default is returned (NcStepType.Start)

No, in C# an enum can have only one value.

There's nothing that says the value in the database must map directly to your enum value however. You could very easily assign a value of Start whenever you read 0 or 1 from the database.

public enum NcStepType { Start = 1 | 0, Stop = 3, Normal = 2 }

No solution in C#. But you can take 2 steps:

1. Set default value of your DB field to 1.
2. Update all existing 0 to 1.

As far as I know you can write this

enum NcStepType { Start = 0, Start = 1, Stop = 3, Normal = 2 }

The only problem is later there would be no way telling which Start was used for variable initialization (it would always look like it was the Start = 0 one).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM