2012-03-07 15 views
24

Özel veriler için Enum s kullanımını yoğunlaştıran bir uygulama yapıyorum. Esasen, bir nesne yaklaşık 28 ayrı öznitelikte veritabanında saklanır. Her öznitelik SQL'den düz bir şekilde Enum'a çevrilen iki karakterli bir alandır. Ne yazık ki, bu değerleri iki farklı insan tarafından okunabilir değerlere de tercüme etmem gerekiyor. Bir veri tablosundaki bir efsane ve bir web uygulaması ön ucunda bir görüntüyü şekillendirmek için bir CSS sınıfı.Enums için özel özellikler tehlikeli midir?

Bunu yapmak için, iki özel öznitelik ayarlıyorum ve gerektiğinde bunları Enum'a uyguladım. Örneğin:

Özel Ayrıntı Arayüz

public interface IAttribute<T> 
{ 
    T Value { get; } 
} 

Örnek Custom Enum

public static R GetAttributeValue<T, R>(IConvertible @enum) 
{ 
    R attributeValue = default(R); 

    if (@enum != null) 
    { 
     FieldInfo fi = @enum.GetType().GetField(@enum.ToString()); 

     if (fi != null) 
     { 
      T[] attributes = fi.GetCustomAttributes(typeof(T), false) as T[]; 

      if (attributes != null && attributes.Length > 0) 
      { 
       IAttribute<R> attribute = attributes[0] as IAttribute<R>; 

       if (attribute != null) 
       { 
        attributeValue = attribute.Value; 
       } 
      } 
     } 
    } 

    return attributeValue; 
} 
dan Özellik Custom Al için

public sealed class AbbreviationAttribute: Attribute, IAttribute<string> 
{ 
    private readonly string value; 

    public AbbreviationAttribute(string value) 
    { 
     this.value = value; 
    } 

    public string Value 
    { 
     get { return this.value; } 
    } 
} 

Yöntemi Özellik Bu Desen

public enum Download 
{ 
    [Abbreviation("check")] 
    [Description("Certified")] 
    C = 1, 

    [Abbreviation("no-formal")] 
    [Description("No formal certification")] 
    NF = 2, 

    [Abbreviation("cert-prob")] 
    [Description("Certified with potential problems")] 
    CP = 3 
} 

Hem Abbreviation ve Description kullanma

Örnek Enum IAttribute<T> uyguladığınız özel özelliklerdir. Benim gerçek Enum 11 olası değere sahiptir ve daha önce de belirttiğim gibi, özel nesnemde 28 ayrı özellikte kullanılır. Özel nitelikleri kullanmak, bu bilgileri ileri ve geri haritalandırmanın en iyi yolu gibi görünüyordu.

Soru için, bunu başarmanın en iyi yolu bu mu? Veritabanındaki Enum değerini (yukarıdaki kod parçasında "C", "NF" veya "CP") saklıyorum, ancak kodumdaki Kısaltma ve Açıklama değerlerine ihtiyacım var. Ayrıca, bu ihtiyacım olacak nihai özel nitelikler kümesi olacağından şüpheliyim.

Bu desenle ilerlemeye devam etmeden önce ... işlerin doğru yolu bu mu? Bu yaklaşımla ilgili olası sorunları daha sonra geri izlemek ve daha sonra yeniden düzenlemek zorunda kalmak yerine düzeltmek istiyorum.

+2

Bazı yerelleştirme sorunlarını – asawyer

+0

İyi noktadan görebiliyordum. Yine de, bir 'gettext' stili yerelleştirme kurulumunu desteklemek için 'IAttribute' değiştirebilirdim. Farkında olmama ihtimali olan ölçeklenebilirlik, performans ve en iyi uygulamalardan endişe duyuyorum. – EAMann

+0

'GetAttributeValue', önceki açıklama metnine aykırı bir uzantı yöntemi değil. –

cevap

13

Bu, kullandığım yöntemle aynı. Bir dezavantajı serileştirme. Özel özellikler değerleri serileştirilmez.bunun yerine

+1

Diğer olumsuz yanı, bir açıklama – eouw0o83hf

+1

@ eouw0o83hf: true değerine kadar bir değişiklik olduğunda, uygulamayı tamamen yeniden dağıtmanız gerektiğidir. son dağıtım seçenekleri (aka ClickOnce) tarafından azaltılmış, ancak siz haklısınız. Uygulamaların çoğu web veya başka birçok şeyin değişeceği dağıtım döngüleri arasında uzun süreler olan şeyler olma eğilimindedir. Bu nedenle, birkaç tanımlamanın güncellenmesi büyük önem taşımamaktadır. –

1

Veritabanını değiştirir misiniz? Bence en iyi seçenek, enumlar ve yabancı anahtarın muhtemel değerlerini barındıran bir tablo (veya tablo) yapmaktır (char kodları kullanmak yerine - bunu daha kolay çeker ve DB'nizi normalleştirir) . Tabloyu bir Abbreviation vesütununa verin, ardından bunları içeri doğru çekin ve anahtarlarına göre gönderin ve aramalar yavaşsa bunları önbelleğe alın.

Öznitelikler hakkında tehlikeli olan bir şey, bu dizelerden herhangi birinin değişmesi gerektiğinde, uygulamanın tam bir yeniden dağıtımı olmasıdır. Veritabanı değerlerini yaparsanız, bunları basit bir UPDATE ile değiştirebilirsiniz.

2

muhtemelen bir karma tablo oluşturmak istiyorum vb bir arama tablosu veya sınıfı, kullanmak zorunda hakkı enum özellik verilerine bağlar ve çünkü

Ben veritabanı yöntemi üzerinde özel bir öznitelik yöntemi gibi Böyle bir şey için özel bir tür. Bu fikri bir nedenden ötürü zaten iptal etmiş olabilirsiniz, ancak uygulamanızın özelliklerini bilmemek için ne yapacağım.

class SpecialType { 
    // include the fields and all attributes that you need to reference, ToString method for debugging, and any serialization you need 
    public string foo { get; set; } 
    public string bar { get; set; } 
    public ToString() { return "SpecialType with foo '" + foo + "' and bar '" + bar + "'"; } 
} 

Dictionary<int, SpecialType> myDict = new Dictionary<int, SpecialType> { 
    { 1, new SpecialType { foo = "XA1B2", bar = "XC3D4" } }, 
    { 2, new SpecialType { foo = "ZA1B2", bar = "ZC3D4" } }, 
    { 3, new SpecialType { foo = "YA1B2", bar = "YC3D4" } }, 
} 

Sonra kolayca bellekten tasarruf belirli bir değer Dictionary Keys, tüm bu caz varlığı kontrol ederek geçerli olup olmadığını öğrenmek için benim diğer sınıflarda int'leri tutabilir. WPF'yi kullanacaksanız veya diske okuma/yazma da yapacaksanız, muhtemelen veri aktarımı yapmak çok daha kolay olacaktır.