Introduction
Focusing on the subject, what am I going to write about the Enum
type?
- Can we assign an
Enum
item to anything that's not of the int
type?
- Why would I even bother thinking about this?
- How can I handle converting something to
Enum
and back to something again?
Background
This all started when I had a database field with a char
, and needed to have a strongly typed way of handling it in my C# code, and then I figured it out, it's possible.
Using the Code
First of all, YES, we can assign an Enum
to something else, a char
!
And how?
Just like you're thinking about it, yes:
public Enum myEnum
{
value1 = 'a',
value2 = 'b'
}
And why would I think about this?
Have you ever had to write some DAL code or mapping an existing database to an ORM, say Entity Framework, and you had fields which contained, for some particular reason, a list of controlled char
s, which aren't related to any other table, like a field called State
which had the possible values, 'R
' for Ready
, 'P
' for Pending
and 'C
' for Cancelled
, and you want to have some nice and type-safe way of manipulating this field on code and at the same time a generic way, which can be used everywhere, well, you can do it using those char
s on an Enum
type:
public Enum State
{
Ready = 'R',
Pending = 'P',
Cancelled = 'C'
}
And how can I handle this? I'll sure try to do a State.ToString()
and it will return a number to me, why??
Because, actually, you can't have an Enum
item with an associated char
, but .NET lets you do this, and internally it converts your char
to its equivalent int
representation (ASCII).
So, now you're thinking, so now what? How can I get my char
??
Simple enough, just cast the Enum
item to a char
first, and then you get its char
representation:
string type = ((char)StateEnum).ToString();
This way, you can extract the char
from the int
, and get your value!
This is for persisting your data to your datasource (convert the Enum
item to the value that your datasource is expecting, the char
).
But now, you need to convert your char
to the corresponding Enum
item, when you get your char
field from your datasource, right?
How can this be done?
Well I've coded a method to do that, with generics, let's see:
Code at pastebin
public static T ToEnum< T >(string @string)
{
if (string.IsNullOrEmpty(@string))
{
throw new ArgumentException("Argument null or empty");
}
if (@string.Length > 1)
{
throw new ArgumentException("Argument length greater than one");
}
return (T)Enum.ToObject(typeof(T), @string[0]);
}
So what you do here is accept a string
(could be a char
, it's just to make it simpler, since many ORMs map a char
on the database to string
, not char
), and then you check your parameters, if they're not null
, and if the length of the string
is one (which matches a char
), and then, you use the ToObject
method from the Enum
type, that accepts the return type you want to get, and the corresponding Enum
item value (int
or char
) to convert to.
And that's it, you can use char
s with an Enum
object, isn't this awesome? When I got around this, I just thought about the numerous times that I needed it...
Hope this helps you as much as it has helped me.
Points of Interest
The key discovery was the conversion from the enum
to char
, you need to cast it to char
first, and only then you can have your char
value, because since the .NET Framework thinks it's an int
, you must convert it to char
(so it translates the int
to the equivalent char
on the ASCII table, like the old method chr()
).
History
- 3rd May, 2010: Initial post