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 ; } } }
Kod ten sprawdza najpierw czy podany typ jest typem wyliczeniowy ,a potem sprawdza czy dany typ wyliczeniowy ma wartość, która może być skojarzona z napisem string. Jeśli tak nie jest rzucam wyjątek..

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.
image

Używając tej metody rozszerzeniowej nie musisz się zbytnio wysilać. Jak działają metody rozszerzeniowe? Więcej o tym w tym wpisie.

image
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”.