Created
October 17, 2013 03:05
-
-
Save traktraktrugui/7018653 to your computer and use it in GitHub Desktop.
Enuns
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
*/ | |
} | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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