Alex Kovanev
Alex Kovanev

Reputation: 1888

How to convert an Enum which is a generic parameter to another Enum?

I have some enum

enum BasicEnum
{
    BasicValue1,
    BasicValue2
    //...
}

What I would like to have is something similar to

public void Foo<TEnum>(TEnum someEnum)
    where TEnum : struct, IComparable, IFormattable, IConvertible
{
    switch (someEnum)
    {
        case BasicEnum.BasicValue1:
            //...
            break;
        case BasicEnum.BasicValue2:
            //...
            break;
    }
}

All the TEnum types contain only the values that present in BasicEnum.

Of course such code is not being compiled so I tried to change it onto this:

public void Foo<TEnum>(TEnum someEnum)
    where TEnum : struct, IComparable, IFormattable, IConvertible
{
    BasicEnum basicEnum = (BasicEnum)someEnum;

    switch (basicEnum)
    {
        //...
    }
}

As expected here I have an error again 'Cannot convert type 'TEnum' to 'BasicEnum''

It's not so difficult to find a trick like

var value = Convert.ToInt32(someEnum);
var basicValue = (BasicEnum)value;

But this solution doesn't seem the one I like so much. Is there a better way?

Upvotes: 2

Views: 1859

Answers (4)

Taylor Devereaux
Taylor Devereaux

Reputation: 125

Given the Following Enums

public enum FirstEnum
{
    FirstEnum1,
    FirstEnum2,
    FirstEnum3
}

public enum SecondEnum
{
    SecondEnum1,
    SecondEnum2,
    SecondEnum3
}

You can cast the second enum to a first enum by doing the following.

SecondEnum secEnum = SecondEnum.SecondEnum2;

FirstEnum firstEnum = (FirstEnum)Enum.ToObject(typeof(FirstEnum), secEnum);

firstEnum will now equal FirstEnum2

You can also create a generic method to convert your enums to your BasicType (i.e. FirstEnum)

public FirstEnum ConvertToFirstEnum(object enumToConvert)
{
    FirstEnum value = (FirstEnum)Enum.ToObject(typeof(FirstEnum), enumToConvert);
    return value;
}

And Call the function as followed:

FirstEnum firstEnum = ConvertToFirstEnum(SecondEnum.SecondEnum3);

The Value of firstEnum will equal FirstEnum3

Upvotes: 2

Mattia Vitturi
Mattia Vitturi

Reputation: 235

I'd go with var success = BasicEnum.TryParse(someEnum.ToString(), out basicEnum), if I understood what you need.

Upvotes: 0

Moho
Moho

Reputation: 16563

Use:

( BasicEnum )Enum.ToObject( typeof( BasicEnum ), someEnum )

Upvotes: 2

Konrad Kokosa
Konrad Kokosa

Reputation: 16898

It is not the prettiest one but you can use (with proper cast checks added):

BasicEnum basicEnum = (BasicEnum)(object)someEnum;

Upvotes: 0

Related Questions