Dal momento che l'enumerazione utilizza numeri interi, quale altra struttura posso usare per darmi l'accesso enum simile al valore legato al nome:Enumerare con tipo di restituzione diverso da stringa?
[So che questo è sbagliato, alla ricerca di un'alternativa]
private enum Project
{
Cleanup = new Guid("2ED3164-BB48-499B-86C4-A2B1114BF1"),
Maintenance = new Guid("39D31D4-28EC-4832-827B-A11129EB2"),
Upgrade = new Guid("892F865-E38D-46D7-809A-49510111C1"),
Sales = new Guid("A5690E7-1111-4AFB-B44D-1DF3AD66D435"),
Replacement = new Guid("11E5CBA2-EDDE-4ECA-BDFD-63BDBA725C8C"),
Modem = new Guid("6F686C73-504B-111-9A0B-850C26FDB25F"),
Audit = new Guid("30558C7-66D9-4189-9BD9-2B87D11190"),
Queries = new Guid("9985242-516A-4151-B7DD-851112F562")
}
EDIT 2014-07-20
Questa è una nuova risposta a questa domanda. Usando la classe Attribute con un metodo helper, definisci gli attributi extra necessari sul tuo enum.
public enum MultiValueEnum
{
[FooAttribute("alpha", 20d, true)]
First,
[FooAttribute("beta", 40.91d, false)]
Second,
[FooAttribute("gamma", 1.2d, false)]
Third,
}
public class FooAttribute : Attribute
{
internal FooAttribute(string name, double percentage, bool isGood)
{
this.Name = name;
this.Percentage = (decimal)percentage;
this.IsGood = isGood;
}
public string Name { get; private set; }
public decimal Percentage { get; private set; }
public bool IsGood { get; private set; }
}
public static TAttribute GetAttribute<TAttribute>(this Enum value)
where TAttribute : Attribute
{
var type = value.GetType();
var name = Enum.GetName(type, value);
return type.GetField(name)
.GetCustomAttributes(false)
.OfType<TAttribute>()
.SingleOrDefault();
}
che rende questo facile:
MultiValueEnum enumVar = MultiValueEnum.First;
var enumStringValue = enumVar.GetAttribute<FooAttribute>().Name;
var enumValueDecimal = enumVar.GetAttribute<FooAttribute>().Percentage;
var enumBool = enumVar.GetAttribute<FooAttribute>().IsGood;
Questa soluzione non costruirà per me. Tuttavia, se si modifica il costruttore su EnumGuid per prendere la stringa e quindi creare il guid da questa stringa lo farà. classe pubblica EnumGuid: Attributo { Guida al pubblico {get; set privato; } public EnumGuid (String s) { this.Guid = Guid.Parse (s); } } – Drauka
Sì, sembra che sia necessario utilizzare i tipi primitivi per i costruttori enum, consultare: http://stackoverflow.com/questions/25859094/an-attribute-argument-must-be-a-constant-expression-create- a-attributo-di. Tuttavia, come dichiarato da @Druaka, converti una stringa in una guida all'interno del costruttore e tutto va bene. – puddinman13