String / Enum Nie ma wbudowanego rzutowania z napisu string na wartość wyliczeniową. Nie można też takiego rzutowania jawnego napisać.(albo tylko tak mi się wydaje) Problem polega na tym ,że string jest klasą ,a enum jest strukturą. Co oznacza ,że konwersja taka nie powinna istnieć. Jest to nawet określone w standardzie języka C#.
Jednakże możesz napisać własną metodę rozszerzeniową, która za ciebie tą konwersje wykona.
public static class StaticTools
{
public static T ConvertToEnum<T>(this string value)
{
if (typeof (T).BaseType != typeof (Enum ))
{
throw new InvalidCastException ();
}
if (Enum .IsDefined(typeof (T), value) == false )
{
throw new InvalidCastException ();
}
try
{
return (T)Enum .Parse(typeof (T), value);
}
catch
{
throw ;
}
}
}
Przykład działania
Powiedzmy ,że masz taki prosty typ wyliczeniowy…
public enum SortExpression
{
Name,
Role
}
…oraz chcesz dwa napisy string przekonwertować na wartości tego typu wyliczeniowego. Nic bardziej trudnego.
Używając tej metody rozszerzeniowej nie musisz się zbytnio wysilać. Jak działają metody rozszerzeniowe? Więcej o tym w tym wpisie.
Do problemu można podejść jeszcze inaczej. Można np. napisać swój własny atrybut bądź skorzystać ze wzorca Typesafe Enum. W ostateczności można też skorzystać z refleksji.
To są dobre pomysły, które wymagają następnych wpisów. Dlatego witam was w cyklu “string i enum”.