2010-09-28 13 views
5

piszę niektóre funkcje Enum, i mają następujące:Dodawanie Ograniczenia dla Nullable Enum

public static T ConvertStringToEnumValue<T>(string valueToConvert, bool isCaseSensitive) 
{ 
    if (typeof(T).BaseType.FullName != "System.Enum" && typeof(T).BaseType.FullName != "System.ValueType") 
    { 
     throw new ArgumentException("Type must be of Enum and not " + typeof (T).BaseType.FullName); 
    } 

    if (String.IsNullOrWhiteSpace(valueToConvert)) 
     return (T)typeof(T).TypeInitializer.Invoke(null); 

    valueToConvert = valueToConvert.Replace(" ", "");    

    if (typeof(T).BaseType.FullName == "System.ValueType") 
    { 
     return (T)Enum.Parse(Nullable.GetUnderlyingType(typeof(T)), valueToConvert, !isCaseSensitive); 
    } 

    return (T)Enum.Parse(typeof(T), valueToConvert, !isCaseSensitive); 
} 

nazywam go tak:

EnumHelper.ConvertStringToEnumValue<Enums.Animals?>("Cat"); 

Chcę teraz dodać do ograniczenia do T Enum, taki jak (który dostałem od Stackoverflow article): where T : struct, IConvertible, ale mam problemy jako T potrzeby, aby móc wziąć zerowe wyliczenia. Komunikat o błędzie:

Typ "Enums.Animals?" musi być typ wartości spoza zerowalne w celu wykorzystania go jako parametr „T” w ogólnym typie lub metodzie

Czy istnieje sposób, aby to zrobić, czy trzeba po prostu polegać na sprawdzaniu wykonawczego, który Mam w środku tę metodę?

Dzięki!

+0

NIE NALEŻY DUPPLIKOWAĆ SWOICH PYTAŃ !!! W obecnej formie twój kod jest fałszywy. Proszę odnieść się do poprzedniego pytania, dlaczego tak mówię. – leppie

+1

@leppie: Chociaż obecny kod jest fałszywy, część ograniczenia nie jest - i jest to osobne pytanie. –

+0

@ Jon Skeet: Wierzę mocno w rozwiązywanie jednego problemu na raz. Sposób, w jaki postępuje PO, po prostu się myli i ostatecznie marnuje cały czas ludzi próbujących mu pomóc. – leppie

Odpowiedz

9

Nie, nie ma ograniczenia, które mówi "T musi być typem wartości, włączając typy wartości zerowych".

Jedną z opcji, jednakże byłoby podzielić metody w celu:

public static T ConvertStringToEnumValue<T>(...) where T : struct 
public static T? ConvertStringToNullableEnumValue<T>(...) where T : struct 

Pomijając wszystko inne, realizacja Każda metoda byłaby wtedy prostsze, too.

Oczywiście nie wiemy, w jaki sposób zamierzasz używać tego kodu - ale jeśli chcesz to nazwać bezpośrednio z nietypowych metod, byłoby to moje zalecane podejście.

Oczywiście, to nadal nie powstrzyma kogoś przed wywołaniem go pod numerem T=int lub coś podobnego ... możesz chcieć spojrzeć na Unconstrained Melody dla bardziej sztywnych więzów.

1

Istnieje sztuczka, która obejmuje C++/CLI, która dopuszcza ogólne ograniczenia na Enums. Napisz podstawową klasę abstrakcyjną w C++/CLI z ograniczeniem Enum. Odwołaj się do biblioteki w projekcie C# i zaimplementuj klasę podstawową.