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?
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.