Je génère des énumérations dynamiques représentant des ID entiers de ma base de données dans une solution C# ASP.NET. Je voudrais deux choses, bien que ce ne soit pas possible.Custom C# Enum ToString() lors de la génération dynamique
1) Je veux que la méthode .ToString() me donne "345" par exemple, pas le nom de la chaîne de l'enum (l'int qu'il représente comme une chaîne). Chaque réponse à cette question semble ajouter
[Description="Blah"]
EnumName = 1
au-dessus de la déclaration et en utilisant une méthode GetDescription(). Je n'ai aucune idée de comment faire cela avec le code dynamique que j'utilise.
2) Je préfère ne pas utiliser un int pour l'utiliser comme tel, je préfère (Enum.Name == 5) par exemple. Si ce n'est pas possible, je vais lancer, mais je ne veux vraiment pas utiliser ((int) Enum.Name)). ToString();
Voici la génération de code dynamique:
public static void Main()
{
AppDomain domain = AppDomain.CurrentDomain;
AssemblyName aName = new AssemblyName("DynamicEnums");
AssemblyBuilder ab = domain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Save);
ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");
List<Type> types = new List<Type>();
foreach(ReferenceType rt in GetTypes())
{
EnumBuilder eb = mb.DefineEnum(rt.Name, TypeAttributes.Public, typeof(int));
foreach (Reference r in GetReferences(rt.ID))
{
eb.DefineLiteral(NameFix(r.Name), r.ID);
}
types.Add(eb.CreateType());
}
ab.Save(aName.Name + ".dll");
foreach (Type t in types)
{
foreach (object o in Enum.GetValues(t))
{
Console.WriteLine("{0}.{1} = {2}", t, o, ((int) o));
}
Console.WriteLine();
//Console.ReadKey();
}
Console.WriteLine();
Console.WriteLine("Dynamic Enums Built Successfully.");
}
public static string NameFix(string name)
{
//Strip all non alphanumeric characters
string r = Regex.Replace(name, @"[^\w]", "");
//Enums cannot begin with a number
if (Regex.IsMatch(r, @"^\d"))
r = "N" + r;
return r;
}
Il peut tout simplement aucun moyen de faire ce que je veux faire, et je serai coincé à l'aide:
(int)Countries.USA //For int value
((int)Countries.CAN).ToString() //For string representation of int value, ex. "354"
Toutes les idées?
Je suis absolument sûr que cela doit être un moyen de générer par réflexion l'attribut Description. –
Je ne vois pas vraiment pourquoi vous utilisez 'ENUM'. C'est vraiment utile quand vous écrivez du code et vous pouvez simplement utiliser une certaine valeur avec un joli nom qui vous dit à quoi il sert vraiment. Peut-être vaut-il mieux utiliser un 'dictionnaire', puisque vous le construisez dynamiquement, que 'enum'? –
Je crée la DLL puis la référence dans mes webapps, puis je lie les listes déroulantes/cases à cocher/listes de radiobutton pour avoir les valeurs des ID dans ma base de données. Je veux ensuite faire des choses comme si (Report == Reports.SevenDay) – Ehryk