16. april 2011 - 14:29Der er
14 kommentarer og 2 løsninger
en bedre måde at styre konstanter med både et id og en værdi
public class ModelType { public int Id { get; set; } public string Value { get; set; } } public enum ModelTypeId { IkkeOplyst = 0, Koeleskab = 1 } public static readonly ModelType[] modelTyper = new ModelType[] { new ModelType() { Id = (int)ModelTypeId.IkkeOplyst, Name = "Ikke oplyst" }, new ModelType() { Id = (int)ModelTypeId.Koeleskab, Name = "Køleskab" } }; public static ModelType GetModeltype(ModelTypeId modelTypeId) { for (int i = 0; i < modelTyper.Length; i++) { if (modelTyper[i].Id == (int)modelTypeId) return modelTyper[i];
} return new ModelType { Id = -1, Name = "Ukendt" }; }
Ville bare lige høre om der findes en smartere måde at håndtere et array af konstanter som indeholder både et id og et navn?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Næh egentlig ikke :) Jeg vil nu ikke bruge enums til det, de er besværlige at arbejde med i den sammenhæng der.
Men jeg ville gøre sådan her istedet:
public class ModelType { public int Id { get; set; } public string Value { get; set; } } public enum ModelTypeId { IkkeOplyst = 0, Koeleskab = 1 } public static readonly ModelType[] modelTyper = new ModelType[] { new ModelType() { Id = (int)ModelTypeId.IkkeOplyst, Name = "Ikke oplyst" }, new ModelType() { Id = (int)ModelTypeId.Koeleskab, Name = "Køleskab" } }; public static ModelType GetModeltype(ModelTypeId modelTypeId) { var type = modelTyper.Where(x => x.Id == (int)modelTypeId).SingleOrDefault();
return type ?? new ModelType { Id = -1, Name = "Ukendt" };
Det duer ikke at have en type med 2 værdier som skal have en bestemt relation men denne relation er ikke sikret via typen.
Saa: * drop ModelType * brug enum ModelTypeId (enum er det helt rigtige til den slags) overalt i koden * lav en static helper method eller en extension method når der i forbindelse med output skal vises en tekst
Ja designet er forkert i det lille stykke kode, men jeg tror det er de færreste der tænker at det lille stykke kode skal bruges til andet end spørgsmålet :)
Hvis koden afspejler virkeligheden og dit eneste behov er en keyvalue lign. type så brug en keyvalue :)
KeyValuePair<int, string>
Eller hvorfor ikke bare bruge enum'en direkte?
Ak ja.. der er mange muligheder, når alt kommer til alt er det nok fordi spørgsmålet ikke er særligt præcist stillet ;-)
namespace E { public enum Classic { HelloWorld, FooBar } public static class EnumPrint { public static string ToReadableString(this Classic e) { switch (e) { case Classic.HelloWorld: return "Hello world"; case Classic.FooBar: return "Foo bar"; default: throw new Exception("Unexpected enum value for Classic"); } } } public class Program { public static void Main(string[] args) { Classic e = Classic.FooBar; Console.WriteLine(e.ToReadableString()); Console.ReadKey(); } } }
public class ModelHelper { public Dictionary<ModelTypeId, string> KVP{get; set;}
public ModelHelper() { KVP.Add(ModelTypeId.IkkeOplyst, "Ikke oplyst"); KVP.Add(ModelTypeId.Koeleskab, "Køleskab"); }
}
public class Foo { public Foo() { var print = new ModelHelper().KVP[ModelTypeId.Koeleskab]; } } [/DIV]
Hvis man kun skal bruge en beskrivelse på sin enum, så er det en mulighed at bruge Description attributten fra ComponentModel, altså: [DIV] using System.ComponentModel;
public class TestMe { public TestMe() { var print = ModelTypeId.Koeleskab.EnumDescription();
} }
public static class EnumExtensions { public static string EnumDescription(this ModelTypeId value) { System.Reflection.FieldInfo fi = value.GetType().GetField(value.ToString());
var attributes = (DescriptionAttribute[])fi.GetCustomAttributes( typeof(DescriptionAttribute), false);
foreach (ModelTypeId modelTypeId in Enum.GetValues(typeof(ModelTypeId))) { int val = (int)modelTypeId; string description = modelTypeId.EnumDescription(); }
GetValues var løsningen. bare se bort fra det sidste spørgsmål.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.