2015-02-24 5 views
9

Ho una tabella di ricerca SQL denominata ClientCreditResolutionPlanActionType che voglio convertire in un in .Come posso aggiungere più attributi a un Enum?

Richiesta molto semplice, giusto? Destra.

Il mio tavolo, ora , tuttavia, ha diverse colonne, o ora, descrizione proprietà che hanno bisogno di andare con lui:

  • StatusIcon
  • StatusText
  • TypeText

Quindi ho pensato che potevo fare ...

namespace System.ComponentModel 
{ 
    class StatusIconAttribute : Attribute 
    { 
     public string StatusIcon; 
     public StatusIconAttribute(string statusIcon) { StatusIcon = statusIcon; } 
    } 

    class StatusTextAttribute : Attribute 
    { 
     public string StatusText; 
     public StatusTextAttribute(string statusText) { StatusText = statusText; } 
    } 

    class TypeTextAttribute : Attribute 
    { 
     public string TypeText; 
     public TypeTextAttribute(string typeText) { TypeText = typeText; } 
    } 
} 

... nel mio Extensions.cs classe ...

public static class EnumExtensions 
{ 
    public static string GetStatusIcon(this Enum value) 
    { 
     var type = value.GetType(); 

     string name = Enum.GetName(type, value);    
     if (name == null) { return null; } 

     var field = type.GetField(name); 
     if (field == null) { return null; } 

     var attr = Attribute.GetCustomAttribute(field, typeof(StatusIconAttribute)) as StatusIconAttribute; 
     if (attr == null) { return null; } 

     return attr.StatusIcon; 
    } 

    public static string GetStatusText(this Enum value) 
    { 
     var type = value.GetType(); 

     string name = Enum.GetName(type, value);    
     if (name == null) { return null; } 

     var field = type.GetField(name); 
     if (field == null) { return null; } 

     var attr = Attribute.GetCustomAttribute(field, typeof(StatusTextAttribute)) as StatusTextAttribute; 
     if (attr == null) { return null; } 

     return attr.StatusText; 
    } 

    public static string GetTypeText(this Enum value) 
    { 
     var type = value.GetType(); 
     string name = Enum.GetName(type, value);    

     var type = value.GetType(); 

     string name = Enum.GetName(type, value);    
     if (name == null) { return null; } 

     var field = type.GetField(name); 
     if (field == null) { return null; } 

     var attr = Attribute.GetCustomAttribute(field, typeof(TypeTextAttribute)) as TypeTextAttribute; 
     if (attr == null) { return null; } 

     return attr.TypeText; 
    } 
} 

... e, infine, nel mio altro progetto utilizzarlo come:

namespace ClientSystemServiceLibrary.Enums 
{ 
    [DataContract] 
    public enum ClientCreditResolutionPlanActionType 
    { 
     [EnumMember] 
     [TypeText("New resolution plan submitted.")] 
     [StatusText("New Plan")] 
     [StatusIcon("star.png")] 
     NewPlan = 1, 

     [EnumMember] 
     [TypeText("Resolution plan waiting on approval.")] 
     [StatusText("Under Review")] 
     [StatusIcon("review.png")] 
     UnderReview = 2, 

     [EnumMember] 
     [TypeText("Resolution plan approved.")] 
     [StatusText("Approved")] 
     [StatusIcon("check.png")] 
     Approved = 3, 

     [EnumMember] 
     [TypeText("Resolution plan rejected.")] 
     [StatusText("Rejected")] 
     [StatusIcon("cross.png")] 
     Rejected = 4, 

     [EnumMember] 
     [TypeText("New resolution plan comment submitted.")] 
     [StatusText("New Comment")] 
     [StatusIcon("message.png")] 
     NewComment = 5 
    } 
}E 

eccezione, quello che ho ho capito che era sbagliato, poiché ricevo questi messaggi di errore:

'System.CompenentModel.TypeT extAttribute' è inaccessibile a causa del livello di protezione

e

Il tipo o dello spazio dei nomi il nome 'TypeText' non è stato trovato (le manca un un riferimento all'assembly direttiva using o?)

Stesso ... per tutti 3.

+1

Cosa intendi con "cosa ho pensato fosse sbagliato"? – Blorgbeard

+0

@Blorgbeard - Aggiunta di chiarimenti tramite messaggi di errore; mi dispiace per quello! –

+1

Perché convertirsi in un enum? Perché non leggere dal tavolo? – Brad

risposta

7

Per impostazione predefinita, tutte le classi sono interne. È necessario specificare il modificatore di accesso "pubblico", se si desidera che siano accessibili da altri assiemi. Così:

public class TypeTextAttribute : Attribute 
{ 
    public string TypeText; 
    public TypeTextAttribute(string typeText) { TypeText = typeText; } 
} 
+0

esattamente quello che ho appena fatto ... Non posso contrassegnare la tua come risposta perché ho funzionato prima, ma sicuramente aggiungerò +1 –

+1

oh che diamine ... Eliminerò il mio e ti darò il controllo = D –

+0

Ora ... l'unica avvertenza è che si deve * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * –