Julekalender: 6. decembers svar

December 8, 2011 15:31 by henrik

Der var godt nok stor uenighed om resultatet af dagens opgave. Følgende tal blev foreslået: 446, 1607, 1667, 1724 og 3519.

Lad os se hvordan man kan gribe opgaven an...

Den første problemstilling er at få fat i "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" assemblyen.

De fleste forslag gik på at bruge Load/LoadFrom via en af følgende variationer:

  Assembly assembly = Assembly.Load(new AssemblyName("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"));
  Assembly assembly = Assembly.Load("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
  Assembly assembly = Assembly.LoadFrom("c:\\windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll");

Nogle enkelte var i deres besvarelser lige så dovne, som jeg selv var i min kode og tog udgangspunkt i en type i den aktuelt refererede mscorlib dll::

  Assembly assembly = typeof(bool).Assembly;

De fleste brugte LINQ til at lave optællingerne med - nogle enkelte brugte dog mere traditionel kode. Det er mest af alt et spørgsmål om smag, hvad man foretrækker.

Der er overordnet set to tilgange til at finde typerne i assemblyen. Man kan enten bruge assembly.GetExportedTypes() eller assembly.GetTypes(). GetExportedTypes returnerer alle de typer, der kan tilgås udenfor assemblyen, mens GetTypes returnerer alle de typer, der er erklæret i assemblyen. Hvis man bruger GetTypes, skal man selv holde rede på, hvilke typer der er public og hvilke der er private. Bemærk at det ikke er nok at teste om IsPublic er true, man skal også huske at teste om IsNestedPublic er true. Skal man være krakilsk (og det skal man jo ;^) så er det desværre faktisk ikke helt nok  blot at teste disse to properties, idet man godt kan have en public type som en nested type (en inner type) i eksempelvis en internal type.  Så bruger man GetTypes, bør man teste om den fundne type ligger i en intern/privat type (og derfor ikke kan tilgås udefra) - en test der så i øvrigt skal gentages for alle niveauer. At det er ret bizart at have en public type der er nested i intern/privat type er jo så en anden sag.

Bruger man

  int enumsCount = assembly.GetExportedTypes().Where(type => type.IsEnum).Count();

finder man frem til, at der er 214 udefra tilgængelige enumereringer.

Da min opgaveformulering ikke var tilstrækkelig præcis i forhold til om public enumereringer i internal/private typer, også skal medtages (eller om det kun er public enumereringer nested i udelukkende public typer, der skal medtages), så godkender jeg dog også de 245 enumereringer, der fås med:

  int enumsCount = assembly.GetTypes().Where(type => (type.IsPublic || type.IsNestedPublic) && type.IsEnum).Count();

Uanset hvilken mængde af enumereringer man finder frem til, skal man efterfølgende have fundet enumereringsværdierne. Der er igen forskellige tilgangsvinkler. Personligt har jeg benyttet mig af følgende LINQ udtryk:

  int enumValueCount = assembly.GetExportedTypes()
    .Where(type => type.IsEnum)
    .Select(type => System.Enum.GetValues(type))
    .Sum(arr => arr.Length);

Der er dog mange forskellige mulige variationer, der lige så godt kan anvendes i stedet. Man kunne for eksempel også bruge følgende:

  int exportedTypesEnumValueCount = assembly.GetExportedTypes()
    .Where(type => type.IsEnum)
    .SelectMany(type => System.Enum.GetNames(type))
    .Count();

Den perfekte løsning er 1724 enumereringsværdier. 1793 ville også blive godkendt (inkluderer enumereringsværdier i public enumereringer der er nestede i interne/private datatyper) - det var der dog alligevel ingen, der havde fundet frem til, så det fik ingen praktisk betydning.

Det var et større arbejde at gå alle de indsendte svar igennem, men jeg fandt frem til ialt tre korrekte besvarelser, som jeg har valgt alle får en af præmierne sponsoreret af http://www.microsoft.com/web/webmatrix/:

ASP.NET bogen går til: Morten Boysen, Brøndby
ASP.NET bogen går til: Mikael Syska, Aarhus
Pluralsight abonnementet går til: Jacob Madsen, Aarhus

Hvis du mener, at du din besvarelse er så korrekt, at du også burde have en præmie så sig til, så kaster jeg endnu et blik på din kode ;^)


Tags:
Categories: Julekalender
Actions: E-mail | Permalink | Comments (1) | Comment RSSRSS comment feed

Comments

December 11. 2011 01:17

Jeanelle Rippel

A person essentially help to make seriously articles I would state. This is the first time I frequented your website page and thus far? I surprised with the research you made to make this particular publish amazing. Excellent job!

Jeanelle Rippel

Comments are closed