Skip to content

Instantly share code, notes, and snippets.

@traktraktrugui
Created October 17, 2013 03:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save traktraktrugui/7018653 to your computer and use it in GitHub Desktop.
Save traktraktrugui/7018653 to your computer and use it in GitHub Desktop.
Enuns
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Data;
using System.ComponentModel;
using System.Dynamic;
namespace DynamicStatus
{
/// <summary>
/// Se o campo descrição da tabela Status contiver multiplas palavras veja o ex. EnumExtensions,
/// senão veja o ex. DynamicStatus.
/// </summary>
/*
+----+-------------+
| Id | Description |
+----+-------------+
| 1 | INVALIDO |
+----+-------------+
| 2 | ATIVO |
+----+-------------+
| 3 | EXCLUIDO |
+----+-------------+
Apesar do campo IDENTITY Id , seria muito interessante colocar o campo Description como UNIQUE,
pois não faz sentido ter status diferentes com a mesma descrição (isso pode evitar possíveis problemas).
*/
// Define um extension method para o IEnumerable<Status> em uma classe estática.
public static class Extensions
{
// A Keyword this é que define um extension method(feature C# 3.5).
public static dynamic AsExpando(this IEnumerable<Status> myListStatus)
{
// ExpandoObject(feature dynamic C# 4.0).
// Cria um objeto do tipo ExpandoObject como um IDictionary, pois ExpandoObject implementa esta interface.
var result = new ExpandoObject() as IDictionary<string, object>;
foreach (Status objStatus in myListStatus)
{
result.add(objStatus.Description, objStatus.Id);
}
return result;
}
}
class Program
{
static void Main(string[] args)
{
// Carrega na memória a tabela Status do banco
//(tabela que o Entity Framework renomeia "Statu" sem o s, podendo ser corrigida com TableAttribute).
private SofisaEntities sofisaEntities = new SofisaEntities();
IEnumerable<Status> entityStatus = sofisaEntities.Statuses;
// Uso do extension method.
// Carrega o objeto allStatus com todos os status do IEnumerable entityStatus.
var allStatus = entityStatus.AsExpando();
// Exemplos de uso.
// O intellisense não poderá ajudar quando pressionar ".", pois o objeto allStatus é resolvido em runtime.
Console.WriteLine(allStatus.INVALIDO); // Output: 1.
int value = (int)allStatus.EXCLUIDO; // Unboxing devido a ExpandoObject sempre retornar um Object - ganha-se com reusabilidade.
/*
Caso haja necessidade de tratar uma chamada desse tipo allStatus.iVALIDO para que não retorne uma exception:
Sobrescreva TryGetMember(GetMemberBinder binder, out object result)
como em (http://www.abhisheksur.com/2010/07/dynamic-behaviour-on-objects-at-runtime.html).
E modifique a última linha para um Nullable int:
int? value = (int)allStatus.EXCLUIDO;
*/
}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Data;
using System.ComponentModel;
namespace EnumExtensions
{
/// <summary>
/// Se o campo descrição da tabela Status contiver multiplas palavras veja o ex. EnumExtensions,
/// senão veja o ex. DynamicStatus.
/// </summary>
/*
+----+--------------------+
| Id | Description |
+----+--------------------+
| 1 | registro invalido |
+----+--------------------+
| 2 | registro ativo |
+----+--------------------+
| 3 | registro excluido |
+----+--------------------+
Apesar do campo IDENTITY Id , seria muito interessante colocar o campo Description como UNIQUE,
pois não faz sentido ter status diferentes com a mesma descrição (isso pode evitar possíveis problemas).
*/
// Define um extension method para o enumStatus em uma classe estática.
public static class Extensions
{
// Representa a tabela Status do banco na memória.
public static IEnumerable<Status> entityStatus;
// A Keyword this é que define um extension method(feature C# 3.5).
public static int GetId(this enumStatus status)
{
// Busca e a descrição de um elemento de enumStatus com GetCustomAttributes()
// e seta em attribDescription.
DescriptionAttribute[] attributes = (DescriptionAttribute[])status.GetType()
.GetField(status.ToString())
.GetCustomAttributes(typeof(DescriptionAttribute), false);
string attribDescription = attributes.Length > 0 ? attributes[0].Description : string.Empty;
// Obtém o objeto Status cujo campo Description corresponda a attribDescription
// e retorna um int correspondente à chave primaria desse registro.
var objStatus = entityStatus.Where(s => s.Description.Equals(attribDescription));
return objStatus.Id;
}
}
public enum enumStatus {
[Description("Registro invalido")]
INVALIDO,
[Description("Registro ativo")]
ATIVO,
[Description("Registro excluido")]
EXCLUIDO
};
class Program
{
static void Main(string[] args)
{
// Seta a propriedade estática entityStatus da classe estática Extensions
// com a tabela Status do banco SofisaEntities
//(tabela que o Entity Framework renomeia "Statu" sem o s, podendo ser corrigida com TableAttribute).
private SofisaEntities sofisaEntities = new SofisaEntities();
Extensions.entityStatus = sofisaEntities.Statu;
// Exemplos de uso
Console.WriteLine(enumStatus.INVALIDO.GetId());
var objCliente = sofisaEntities.Clientes.Where(c => c.Status == enumStatus.ATIVO.GetId());
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment