Je me suis causé quelques maux de tête au cours des deux dernières semaines avec le modèle curiously recurring template.Existe-t-il une alternative au modèle de modèle curieusement récurrent?
Faisant suite à ces deux questions à moi:
- What’s the correct way of retrieving my custom enumeration classes by their value?
- Why are my static objects not being instantiated when first access to the static class is a static method on the base class?
Comment puis-je améliorer l'exemple suivant:
public class DocketType : Enumeration<DocketType, int, string>
{
public static DocketType Withdrawal = new DocketType(2, "Withdrawal");
public static DocketType Installation = new DocketType(3, "Installation");
private DocketType(int docketTypeId, string description)
: base(docketTypeId, description) { }
}
Je veux une méthode statique que je n'ai pas à répéter dans le Enumeration
classe:
public abstract class Enumeration<TEnum, X, Y> : IComparable
where TEnum : Enumeration<TEnum, X, Y>
{
protected Enumeration(X value, Y displayName)
{
AddToStaticCache(this);
}
public static TEnum Resolve(X value)
{
return Cache[value] as TEnum;
}
}
Le problème avec cela, comme vous le verrez de ma deuxième question liée, est que l'appel à Enumeration<DocketType, int, string>.Resolve(X value);
ne provoque pas les objets statiques DocketType
à instancier.
Je ne suis pas opposé à totalement réécrire cela à partir de zéro. Je sais que c'est une grosse odeur de code. Actuellement, pour que cela fonctionne, ma classe de base a la méthode statique protégée ChildResolve
et j'ai ajouté Resolve
à chacune de mes classes Enumeration. Trucs méchants!
RÉPONSE:
semble qu'il n'y avait pas d'alternative agréable au motif, donc je coincé avec le motif et se est inspiré de la réponse acceptée et est venu avec ceci:
static Enumeration()
{
GetAll();
}
public static void GetAll()
{
var type = typeof(TEnum);
var fields = type.GetFields(BindingFlags.Public |
BindingFlags.Static | BindingFlags.DeclaredOnly);
foreach (var info in fields)
{
var locatedValue = info.GetValue(null) as Enumeration<TEnum, X, Y>;
Cache.Add(locatedValue.Value, locatedValue);
}
}
C'est aussi le même code en utilisant dans le projet exemple CodeCampServer MVC, donc je me sens moins sale pour l'utiliser!
Merci! +1 et en acceptant comme il a inspiré la réponse que j'ai trouvée. – GenericTypeTea