Em Java, é possível ter métodos dentro de uma enumeração.
Existe essa possibilidade em C # ou é apenas uma coleção de cadeias e é isso?
Tentei substituir, ToString()
mas ele não é compilado. Alguém tem um exemplo de código simples?
Em Java, é possível ter métodos dentro de uma enumeração.
Existe essa possibilidade em C # ou é apenas uma coleção de cadeias e é isso?
Tentei substituir, ToString()
mas ele não é compilado. Alguém tem um exemplo de código simples?
Respostas:
Você pode escrever métodos de extensão para tipos de enumeração:
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();
}
}
Você pode escrever um método de extensão para sua enumeração:
Como criar um novo método para uma enumeração (Guia de Programação em C #)
Outra opção é usar a classe de enumeração criada por Jimmy Bogard .
Basicamente, você deve criar uma classe que herda dele Enumeration
. Exemplo:
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}!";
}
}
Então você pode usá-lo como um enum, com a possibilidade de colocar métodos dentro dele (entre outras coisas):
EmployeeType.Manager.ToString();
//0 - Manager
EmployeeType.Servant.ToString();
//1 - Servant
EmployeeType.Assistant.ToString();
//2 - Assistant to the Regional Manager
Você pode baixá-lo com o NuGet .
Embora essa implementação não seja nativa no idioma, a sintaxe (construção e uso) é bastante próxima dos idiomas que implementam enumerações nativamente melhores que o C # ( Kotlin, por exemplo).
Não. Você pode criar uma classe, em seguida, adicionar um monte de propriedades para a classe um pouco emular um enum, mas isso não é realmente a mesma coisa .
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.
}
}
Um padrão melhor seria colocar seus métodos em uma classe separada do seu emum.
Desde que me deparei, e precisava exatamente o oposto de enum para string, aqui está uma solução genérica:
static class EnumExtensions {
public static T GetEnum<T>(this string itemName) {
return (T) Enum.Parse(typeof(T), itemName, true);
}
}
Isso também ignora maiúsculas e minúsculas e é muito útil para analisar a resposta REST da sua enumeração para obter mais segurança de tipo. Espero que ajude alguém
C # Não permite o uso de métodos em enumeradores, pois não é um princípio baseado em classe, mas sim uma matriz bidimensional com uma string e um valor.
O uso de classes é altamente desencorajado pela Microsoft, nesse caso, use struct (dados) (ures); O STRUCT foi concebido como uma classe leve para dados e seus manipuladores e pode lidar com funções muito bem. O C # e seu compilador não possuem os recursos de rastreamento e eficiência, como se conhece no JAVA, onde quanto mais vezes uma determinada classe / método é usada, mais rapidamente ela é executada e seu uso se torna 'antecipado'. O C # simplesmente não possui isso; portanto, para diferenciar, use STRUCT em vez de CLASS.