In Java, è possibile avere metodi all'interno di un enum.
C'è una tale possibilità in C # o è solo una raccolta di stringhe e basta?
Ho provato a eseguire l'override ToString()
ma non viene compilato. Qualcuno ha un semplice esempio di codice?
In Java, è possibile avere metodi all'interno di un enum.
C'è una tale possibilità in C # o è solo una raccolta di stringhe e basta?
Ho provato a eseguire l'override ToString()
ma non viene compilato. Qualcuno ha un semplice esempio di codice?
Risposte:
È possibile scrivere metodi di estensione per tipi di enum:
enum Stuff
{
Thing1,
Thing2
}
static class StuffMethods
{
public static String GetString(this Stuff s1)
{
switch (s1)
{
case Stuff.Thing1:
return "Yeah!";
case Stuff.Thing2:
return "Okay!";
default:
return "What?!";
}
}
}
class Program
{
static void Main(string[] args)
{
Stuff thing = Stuff.Thing1;
String str = thing.GetString();
}
}
Puoi scrivere un metodo di estensione per il tuo enum:
Procedura: creare un nuovo metodo per un'enumerazione (Guida per programmatori C #)
Un'altra opzione è quella di utilizzare la classe di enumerazione creata da Jimmy Bogard .
Fondamentalmente, devi creare una classe che eredita dalla sua Enumeration
. Esempio:
public class EmployeeType : Enumeration
{
public static readonly EmployeeType Manager
= new EmployeeType(0, "Manager");
public static readonly EmployeeType Servant
= new EmployeeType(1, "Servant");
public static readonly EmployeeType Assistant
= new EmployeeType(2, "Assistant to the Regional Manager");
private EmployeeType() { }
private EmployeeType(int value, string displayName) : base(value, displayName) { }
// Your method...
public override string ToString()
{
return $"{value} - {displayName}!";
}
}
Quindi puoi usarlo come un enum, con la possibilità di inserire metodi al suo interno (tra le altre cose):
EmployeeType.Manager.ToString();
//0 - Manager
EmployeeType.Servant.ToString();
//1 - Servant
EmployeeType.Assistant.ToString();
//2 - Assistant to the Regional Manager
Puoi scaricarlo con NuGet .
Sebbene questa implementazione non sia nativa nella lingua, la sintassi (costruzione e utilizzo) è abbastanza vicina ai linguaggi che implementano gli enum in modo nativo migliore di C # ( Kotlin per esempio).
No. Puoi creare una classe, quindi aggiungere un sacco di proprietà alla classe per emulare un po ' un enum, ma non è proprio la stessa cosa .
class MyClass
{
public string MyString1 { get{ return "one";} }
public string MyString2 { get{ return "two";} }
public string MyString3 { get{ return "three";} }
public void MyMethod()
{
// do something.
}
}
Un modello migliore sarebbe quello di mettere i tuoi metodi in una classe separata dalla tua emum.
Da quando mi sono imbattuto, e avevo bisogno dell'esatto contrario di enum alla stringa, ecco una soluzione generica:
static class EnumExtensions {
public static T GetEnum<T>(this string itemName) {
return (T) Enum.Parse(typeof(T), itemName, true);
}
}
Ciò ignora anche il caso ed è molto utile per analizzare la risposta REST al tuo enum per ottenere una maggiore sicurezza del tipo. Spero che aiuti qualcuno
C # Non consente l'uso di metodi negli enumeratori in quanto non è un principio di classe, ma piuttosto un array bidimensionale con una stringa e un valore.
L'uso delle classi è fortemente scoraggiato da Microsoft in questo caso, utilizzare invece (data) struct (ures); STRUCT è concepito come una classe leggera per i dati e i suoi gestori e può gestire bene le funzioni. C # e il suo compilatore non hanno le capacità di tracciamento ed efficienza come si sa da JAVA, dove più volte viene utilizzata una determinata classe / metodo più veloce viene eseguito e il suo utilizzo diventa "anticipato". C # semplicemente non ce l'ha, quindi per differenziare, usa STRUCT invece di CLASS.