Auxiliar.cs

<< Click to Display Table of Contents >>

Navigation:  Persistencia > Modelo > classes >

Auxiliar.cs

Previous pageReturn to chapter overviewNext page

using System;

using System.Linq.Expressions;

using System.Reflection;

 

namespace Modelo.classes

{

    public static class Auxiliar

    {

        public struct Retorno

        {

            public Type Tipo { getset; }

            public string FieldName { getset; }

            

            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;

        }

         **/

    }

}