Reputation: 1888
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
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
Reputation: 235
I'd go with var success = BasicEnum.TryParse(someEnum.ToString(), out basicEnum)
, if I understood what you need.
Upvotes: 0
Reputation: 16898
It is not the prettiest one but you can use (with proper cast checks added):
BasicEnum basicEnum = (BasicEnum)(object)someEnum;
Upvotes: 0