Sunday, June 30, 2013

Sasa.Enums - Typed Enum API

I recently realized that I had missed one important class in the core Sasa.dll assembly, so my blog series isn't technically complete. So here's my twenty-fourth post in the series:

Sasa.Enums

Sasa.Enums provides a statically typed API for working with enums, analogous to the dynamically typed System.Enum. Every method call in System.Enum that accepts a System.Type representing the enum type, here accepts a type parameter that is constrained to be of type enum.

Sasa.Enums.HasFlag

The Sasa.Enums.HasFlag extension method checks for the presence of flag bits set in an enum that has the FlagsAttribute applied:

[Flags]
enum Foo
{
  Bar = 1,
  Other = 2,
}
var value = Foo.Bar | Foo.Other;
Console.WriteLine(value.HasFlag(Foo.Bar))
Console.WriteLine(Foo.Other.HasFlag(Foo.Bar))
// output:
// true
// false

Sasa.Enums.IsDefined

The Sasa.Enums.IsDefined extension method checks whether the given enum value is valid:

enum Foo
{
  Bar,
}
var defined = Foo.Bar;
Console.WriteLine(defined.IsDefined());

var undefined = (Foo)10;
Console.WriteLine(undefined.IsDefined());

// output:
// true
// false

Sasa.Enums.Names

The Sasa.Enums.Names static method provides a enumerable sequence of strings corresponding to the enum's descriptive names. Essentially, this is the equivalent of System.Enum.GetNames, except it's statically typed with an enum constraint, and it returns a cached immutable sequence so it avoids the overhead of allocating an array for every call:

enum Foo
{
  Bar,
  Other,
}
foreach (var x in Enums.Names<Foo>())
{
  Console.WriteLine(x);
}
// output:
// Bar
// Other

Sasa.Enums.ToEnum

The Sasa.Enums.ToEnum set of extension methods provides simple enum parsing:

enum Foo
{
  Bar,
  Other,
}
Foo bar = "Bar".ToEnum<Foo>();
if (bar == Foo.Bar)
  Console.WriteLine(bar);
// output:
// Bar

An exception is thrown if the provided string is not a valid enum name.

Sasa.Enums.TryParse

The Sasa.Enums.TryParse set of extension methods implements non exception-throwing pattern of parsing enums:

enum Foo
{
  Bar,
  Other,
}
Foo bar;
if ("Bar".TryParse<Foo>(out bar);)
  Console.WriteLine(bar);
// output:
// Bar

Sasa.Enums.Values

The Sasa.Enums.Values method provides all the underlying values of the given enum type. Like the Enums.Names method, it returns a cached immutable sequence so it avoids the overhead of allocating arrays for every call:

enum Foo
{
  Bar,
  Other,
}
foreach (var x in Enums.Values<Foo>())
{
  Console.WriteLine(x);
}
// output:
// Bar
// Other

No comments: