Noen som vet en god løsning for mangelen på en generisk begrensning?

 C Programming >> C C# Program >  >> C#
Noen som vet en god løsning for mangelen på en generisk begrensning?

EDIT:Dette er nå live i versjon 0.0.0.2 av UnconstrainedMelody.

(Som bedt om i blogginnlegget mitt om enum-begrensninger. Jeg har tatt med de grunnleggende faktaene nedenfor for å gi et frittstående svar.)

Den beste løsningen er å vente på at jeg inkluderer den i UnconstrainedMelody 1 . Dette er et bibliotek som tar C#-kode med "falske" begrensninger som

where T : struct, IEnumConstraint

og gjør den om til

where T : struct, System.Enum

via et postbuild-trinn.

Det burde ikke være for vanskelig å skrive IsSet ... selv om catering for begge Int64 -basert og UInt64 -baserte flagg kan være den vanskelige delen. (Jeg kjenner lukten av noen hjelpemetoder som i utgangspunktet lar meg behandle alle flaggenum som om de hadde en basistype UInt64 .)

Hvordan ville du at oppførselen skulle være hvis du ringte

tester.IsSet(MyFlags.A | MyFlags.C)

? Skal den sjekke at alle er de angitte flaggene satt? Det ville være min forventning.

Jeg skal prøve å gjøre dette på vei hjem i kveld... Jeg håper å ha et raskt blitz på nyttige enum-metoder for å få biblioteket opp til en brukbar standard raskt, og deretter slappe av litt.

EDIT:Jeg er ikke sikker på IsSet som navn, forresten. Alternativer:

  • Inkluderer
  • Inneholder
  • HasFlag (eller HasFlags)
  • IsSet (det er absolutt et alternativ)

Tanker velkommen. Jeg er sikker på at det vil ta en stund før noe er hugget i stein uansett...

1 eller send den inn som en oppdatering, selvfølgelig...


Fra og med C# 7.3 er det nå en innebygd måte å legge til enum-begrensninger:

public class UsingEnum<T> where T : System.Enum { }

kilde:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/where-generic-type-constraint


Darren, det ville fungert hvis typene var spesifikke opptellinger - for at generelle opptellinger skal fungere, må du kaste dem til ints (eller mer sannsynlig uint) for å gjøre den boolske regnestykket:

public static bool IsSet( this Enum input, Enum matchTo )
{
    return ( Convert.ToUInt32( input ) & Convert.ToUInt32( matchTo ) ) != 0;
}