Question

Je suis juste de commencer Generics en C#, mais se sont heurtés à un problème dès le début, comment puis-je appeler .HasFlag() sur un générique Enum?

public class Example<TEnum> where TEnum : struct {
}

Comment puis-je ajouter de la [Flags] attribut?

Était-ce utile?

La solution

L'appel de la méthode d'instance exigera de boxe de toute façon, donc, puisque vous ne pouvez pas contraindre Enum, juste abandonner les génériques et l'utilisation Enum.Par exemple, au lieu de:

void Something(TEnum enumValue, TEnum flags)
{
    if (enumValue.HasFlags(flags))
        //do something ...
}

Faire cela:

void Something(Enum enumValue, Enum flags)
{
    if (enumValue.HasFlags(flags))
        //do something ...
}

Dans une méthode générique, vous pouvez atteindre votre objectif, comme ceci:

void Something(TEnum enumValue, TEnum flags)
{
    Enum castValue = (Enum)(object)enumValue;
    Enum castFlags = (Enum)(object)flags;

    if (castValue.HasFlags(castFlags))
        //do something ...
}

Cela permettra de lever une exception lors de l'exécution si vous appelez la méthode avec un type de la valeur qui n'est pas un enum.Vous pouvez également jeter sur ValueType plutôt que de object, puisque le paramètre type est connu pour représenter un type de valeur:

Enum castValue = (Enum)(ValueType)enumValue;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top