2010-11-01 4 views
0

Je crée les classes POCO wrapper pour ENUM dans Entity Framework 4 comme mentionné here. J'ai créé l'emballage pour l'énumération comme suitComment rendre ce code générique?

public class PriorityWrapper 
    { 
     private gender _t; 
     public int Value 
     { 
      get 
      { 
       return (int)_t; 
      } 
      set 
      { 
       _t = (gender)value; 
      } 
     } 
     public gender EnumValue 
     { 
      get 
      { 
       return _t; 
      } 
      set 
      { 
       _t = value; 
      } 
     } 

     public static implicit operator PriorityWrapper(gender p) 
     { 
      return new PriorityWrapper { EnumValue = p }; 
     } 

     public static implicit operator gender(PriorityWrapper pw) 
     { 
      if (pw == null) return gender.Male; 
      else return pw.EnumValue; 
     } 
    } 

Mais j'ai aussi d'autres ENUM en dehors du genre comme mentionné ci-dessus. Puis-je utiliser des génériques ici afin que je puisse utiliser le même code pour toutes les occurrences ENUM. Je suis novice dans le domaine des génériques, j'ai donc besoin de l'aide d'experts.

Répondre

0

Il n'est pas possible d'avoir des opérateurs de conversion génériques. Donc, il ne peut pas y avoir d'équivalent générique exact pour le code ci-dessus. De plus, on ne peut pas parler d'enum comme contrainte de type générique, donc la transposition dans l'implémentation de propriété n'est pas possible (ou peut nécessiter une autre contrainte (éventuellement interface) pour travailler qui peut entraîner boxing/unboxing). En bref, l'OMI, avoir une solution générique avec une performance raisonnable peut ne pas être réalisable.

Je suggère que vous essayez d'utiliser la génération de code (regardez les modèles T4) pour créer vos classes wrapper. T4 est assez simple - référez-vous ici pour quelques liens: http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx

1

Vous ne pouvez pas utiliser enums comme contraintes génériques, vous pouvez utiliser à la place.

public class EnumWrapper<T> 
    { 
     public static int Num = 1; 
     private T _t; 

     public T EnumValue 
     { 
      get 
      { 
       return _t; 
      } 
      set 
      { 
       _t = value; 
      } 
     } 

     public void Assign<U>(U inn) where U : struct, T 
     { 
      if (typeof(T).IsEnum) 
      { 
       EnumValue = inn; 
      } 


     } 
    } 

et invoquer comme ceci

  var agen = new EnumWrapper<gender>(); 
      gender g=new gender() ; 
      agen.Assign (g); 

EDIT: Assign() est une méthode factice. Mon intention était de montrer comment utiliser enum comme contrainte générique.

+0

n'a pas de sens. Pourquoi ferait-on agen.Assign (gender.Male) quand il peut faire agen.EnumValue = gender.Male? OP a besoin de la capacité de convertir enum de/vers des entiers. – VinayC

+0

@VinayC, oui vous avez raison, il n'a pas de sens, OP est en fait demandé comment faire enum lié classe générique. Donc je viens de créer une classe fictive. Mon intention était de lui montrer comment utiliser enum comme contrainte générique .... – RameshVel

+0

@ Ramesh - Et si j'ai besoin de retourner la valeur par défaut de Enum à partir de wrapper lui-même? – Ram