|
<< Click to Display Table of Contents >> Auxiliar.cs |
![]() ![]()
|
using System;
using System.Linq.Expressions;
using System.Reflection;
namespace Modelo.classes
{
public static class Auxiliar
{
public struct Retorno
{
public Type Tipo { get; set; }
public string FieldName { get; set; }
public void Clear()
{
Tipo = typeof(string);
FieldName = string.Empty;
}
}
/*
* http://stackoverflow.com/questions/4657311/reflection-get-property-name
*
public class Pessoa
{
public int Codigo { get; set; }
public string Nome { get; set; }
public int Idade { get; set; }
}
string propName1 = GetPropertyName(() => new Pessoa().Nome);
string propName2 = GetPropertyName(() => new Pessoa().Codigo);
string propName3 = GetPropertyName(() => new Pessoa().Idade);
Console.WriteLine(propName1 + ", " + propName2 + ", " + propName3);
*/
/// <summary>
/// Método privado que recebe uma expressão lambda contendo um objeto.propriedade
/// e executando um reflection pega o nome dessa propriedade em forma de string.
/// Veja no fonte alguns exemplos
/// </summary>
private static string GetProp<T>(Expression<Func<T>> exp)
{
//return (((MemberExpression)(exp.Body)).Member).Name; <-- original, muito complicado
var me = exp.Body as MemberExpression;
if (me == null)
return null;
else
return me.Member.Name;
}
/*
// requires explicit specification of both object type and property type
static string GetPropertyName<TObject, TResult>(Expression<Func<TObject, TResult>> exp)
{
// extract property name
return (((MemberExpression)(exp.Body)).Member).Name;
}
// requires explicit specification of object type
static string GetPropertyName<TObject>(Expression<Func<TObject, object>> exp)
{
return (((MemberExpression)(exp.Body)).Member).Name;
}
*/
/// <summary>
/// Método que recebe uma expressão lambda contendo um objeto.propriedade
/// e executando um reflection pega o nome do campo vinculado ao atributo CampoAttribute desta propriedade
/// </summary>
public static Retorno GetInfo<T, O>(Expression<Func<T>> exp, O obj)
{
Retorno ret = new Retorno();
ret.Clear();
// aqui transforma a propriedade em string (entra Usuario.Nome e sai "Nome")
string propridade = GetProp(exp);
// aqui pegamos os "membros" do objeto pai da propriedade
MemberInfo[] members = obj.GetType().GetMembers();
// percorremos todos
foreach (MemberInfo member in members)
{
if (member.MemberType != MemberTypes.Property)
continue;
// se o nome do membro bate com o da propriedade
if (member.Name.ToString().Equals(propridade))
{
// pegamos oos "CustosAtributes"
object[] attributes = member.GetCustomAttributes(true);
if (attributes.Length == 0)
continue;
// pegamos o CampoAtribute e retornamos o FieldName
CampoAttribute da = (CampoAttribute)attributes[0];
ret.FieldName = da.FieldName;
ret.Tipo = ((PropertyInfo)member).PropertyType;
}
}
return ret;
}
/// <summary>
/// Método que recebe uma expressão lambda contendo um objeto.propriedade
/// e executando um reflection pega o nome do campo vinculado ao atributo CampoAttribute desta propriedade
/// </summary>
public static string GetFieldName<T, O>(Expression<Func<T>> exp, O obj)
{
// aqui transforma a propriedade em string (entra Usuario.Nome e sai "Nome")
string propridade = GetProp(exp);
// aqui pegamos os "membros" do objeto pai da propriedade
MemberInfo[] members = obj.GetType().GetMembers();
// percorremos todos
foreach (MemberInfo member in members)
{
// se o nome do membro bate com o da propriedade
if (member.Name.ToString().Equals(propridade))
{
// pegamos oos "CustosAtributes"
object[] attributes = member.GetCustomAttributes(true);
if (attributes.Length == 0)
continue;
// pegamos o CampoAtribute e retornamos o FieldName
CampoAttribute da = (CampoAttribute)attributes[0];
return da.FieldName;
}
}
return string.Empty;
}
/**
/// <summary>
/// Método que recebe uma expressão lambda contendo um objeto.propriedade
/// e retona o tipo da propriedade
/// </summary>
public static Type GetFieldType<T, O>(Expression<Func<T>> exp, O obj)
{
// aqui transforma a propriedade em string (entra Usuario.Nome e sai "Nome")
string propridade = GetProp(exp);
// aqui pegamos os "membros" do objeto pai da propriedade
MemberInfo[] members = obj.GetType().GetMembers();
// percorremos todos
foreach (MemberInfo member in members)
{
if (member.MemberType != MemberTypes.Property)
continue;
// se o nome do membro bate com o da propriedade
if (member.Name.ToString().Equals(propridade))
{
return ((PropertyInfo)member).PropertyType;
}
}
return null;
}
**/
}
}