snappymcsnap
snappymcsnap

Reputation: 2103

treat Enum as generic?

I'm trying to find a way to treat enums generically but I can't find a way to make it work. Say I have several enums declared something like this:

public enum ABC {
    One, 
    Two,
    Three
}

public enum DEF {
    Four,
    Five,
    Six
}

and I want to write a method that takes an Enum as a parameter and simply returns name of the enum like this:

public string GetEnumName(Enum anEnum) {
    return anEnum.GetType().Name;
}

but if I call it like GetEnumName(DEF); I get the 'is a type being used as a variable' error. Any ideas? thanks

EDIT Sorry judging by the replies I may not have been clear enough. I merely chose GetEnumName as a very simplistic example to illustrate the problem, not how to get the name from a type. Basically I want a method that I can pass ANY enum to and have it act on that enum directly, thanks

Upvotes: 2

Views: 316

Answers (6)

N_A
N_A

Reputation: 19897

Your problem is that you are passing in the type instead of the System.Type. Change your method to this:

public string GetEnumName(Type enumType) {
    return enumType.Name;
}

Upvotes: 1

Romain Verdier
Romain Verdier

Reputation: 12971

What you want to write is something like this:

public string GetEnumName<T>() where T : Enum
{
    return typeof(T).Name;
}

That is, a generic method with a type parameter constraint.

Unfortunately, there is no way to define such a constraint for enums in C# (nor it is possible to define one for delegates). People usually go for the solution mentioned by @ananthonline.

In fact such constraint is not supported by the C# language but it is supported at the CLR level. Using a tool like Mono.Cecil for example can help you to modify your assembly and apply the constraint on the method after you get it compiled.

Have a look to this article: Constraining generic constraints

You'll find a tool which eases the process of applying non-C#-supported generic type parameter constraints: Cecil constraint patcher

And don't forget there are a lot of useful static methods on the Enum class if you want to work with the names and values of your enum members.

Upvotes: 1

Ani
Ani

Reputation: 10896

Perhaps this will do the trick?

public static class EnumExtensions
{
    public static string GetEnumName<T>(this T value) where T : struct
    {
        var type = typeof(T);
        if (!type.IsEnum)
            throw new InvalidOperationException(string.Format("{0} is not an enum", type));
        return type.GetEnumName(value);
    }
}

Upvotes: 1

Chris Shain
Chris Shain

Reputation: 51329

You can't. Generic constraints are not allowed on enum types (including System.Enum). Use Enum.GetName instead.

Upvotes: 0

Kirill Polishchuk
Kirill Polishchuk

Reputation: 56162

Use:

public static string GetTypeName<T>()
{
    return typeof(T).Name;
}

Usage:

var result = GetTypeName<DEF>();

Upvotes: 3

BrokenGlass
BrokenGlass

Reputation: 160902

Just pass the type:

public string GetEnumName(Type enumType)
{
    return enumType.Name;
}

And

GetEnumName(typeof(ABC));

At this point if your method does nothing else you could probably just use typeof(ABC).Name instead.

Upvotes: 0

Related Questions