Hola Leandro

No es muy lindo lo que vas a hacer, pero te doy una punta.
Podes usar StackTrace para que el nombre de la propiedad que invoca al
atributo sea dinamica, incluso podrias extraer parte del codigo y meterlo en
un helper.

El secreto esta en este pedacito:
                System.Reflection.PropertyInfo pi =this.GetType
().GetProperty("Propiedad");
                foreach (LazyAtribute o in
pi.GetCustomAttributes(typeof(LazyAtribute),
false))
                {
                    propiedad=(o.GetProvider() as Provider).GetItems(2);
                }
Es bastante mejorable si te pones.

Tenes que tener en cuenta que es muy acoplado, pero, funciona.  :))

Te adjunto un rar con la solucion completa, no se si no la filtrara el mug.
Por las dudas te pego todo el código aca abajo.

Saludos

Daniel Calvin
PD: Yo usaria proxies dinámicos.... :))


Tu clase sera algo asi si mal no entendi:

using System;
using System.Collections.Generic;
using System.Text;
using AlgoDeAtributos00;

namespace AlgoDeAtributos
{
    public class AlgunaClase
    {
        private string[] propiedad;

        [LazyAtribute(typeof(ProviderA))]
        public string[] Propiedad
        {
            get {
                System.Reflection.PropertyInfo pi =this.GetType
().GetProperty("Propiedad");
                foreach (LazyAtribute o in
pi.GetCustomAttributes(typeof(LazyAtribute),
false))
                {
                    propiedad=(o.GetProvider() as Provider).GetItems(2);
                }
                return propiedad;
            }
            set { propiedad = value; }
        }

        [LazyAtribute(typeof(ProviderB))]
        public string[] OtraPropiedad
        {
            get
            {
                System.Reflection.PropertyInfo pi = this.GetType
().GetProperty("OtraPropiedad");
                foreach (LazyAtribute o in
pi.GetCustomAttributes(typeof(LazyAtribute),
false))
                {
                    propiedad = (o.GetProvider() as Provider).GetItems(2);
                }
                return propiedad;
            }
            set { propiedad = value; }
        }
        public AlgunaClase(){ }
    }
}

Bueno el programita de prueba seria algo asi:

using System;
using System.Collections.Generic;
using System.Text;

namespace AlgoDeAtributos
{
    class Program
    {
        static void Main(string[] args)
        {
            AlgunaClase ac = new AlgunaClase();
            foreach (string s in ac.Propiedad)
                Console.WriteLine(s);
            foreach (string s in ac.OtraPropiedad)
                Console.WriteLine(s);
        }
    }
}
La salida producida algo parecido a esto:
Item uno
Item dos
Item unoPrima
Item dosPrima

Tu atributo LazyAttributte es algo asi:

using System;
using System.Collections.Generic;
using System.Text;

namespace AlgoDeAtributos00
{
    public class LazyAtribute:Attribute
    {
        private Provider provider =null;
        public LazyAtribute(Type factoryType)
        {
            this.provider = factoryType.InvokeMember("",
System.Reflection.BindingFlags.CreateInstance, null, this.provider, null) as
Provider;
        }
        public Provider GetProvider() { return provider; }
    }
}
Tus providers para que el ejemplo funcione serian:


using System;
using System.Collections.Generic;
using System.Text;

namespace AlgoDeAtributos00
{

    public abstract class Provider
    {
        public abstract string[] GetItems(int family);

    }
    public class ProviderA:Provider
    {
        public ProviderA() { }
        public override string[] GetItems(int family) { return new string[]
{ "Item uno", "Item dos" }; }
    }
    public class ProviderB : Provider
    {
        public ProviderB() { }
        public override string[] GetItems(int family) { return new string[]
{ "Item unoPrima", "Item dosPrima" }; }
    }
}


El día 15/11/07, Leandro Tuttini <[EMAIL PROTECTED]> escribió:
>
> Muchas gracias a todos por las respuestas.
>
> Les comento, la idea es hacer en un principio algo simple, la entidad
> deberia poder utilizar los atributos y a este indicarle que Factory de
> provider utilizar o es el especializado para cargar la propiedad.
> Se que con esto queda medio acoplada la entidad pero seria la primer
> version de prueba.
>
> En el final de seguro sera algo con dinamic proxy o algo asi, de seguro al
> estilo que se utiliza en Castle project,
> http://www.castleproject.org/dynamicproxy/index.html
>
> Si tienen ejemplos seran de mucha ayuda, que muestre como un atributo se
> ejecute antes de la propiedad y que permita setear el valor de esta.
> Cualquier ejemplo que vean pueden aportar sera de ayuda, y que por
> supuesto puedan compartir.
> Lo que no me termina de cerrar es como desde un atributo poder acceder a
> la variable de la propiedad, para asignarle un valor.
>
> Diego muy bueno el ejemplo de codeproject, aunque por lo que vi utiliza
> una libreria PostSharp, creo que el secreto esta en esta.
>
> Bueno voy a seguir analizando el tema.
> Saludos
> **
>
> ------------------------------
>
> Los referentes más importantes en compra/venta de autos se juntaron:
> Demotores y Yahoo!. Ahora comprar o vender tu auto es más fácil.
> Visitá http://ar.autos.yahoo.com/
>
>


-- 
Daniel A. Calvin
Cooperator Team Member
http://www.cooperator.com.ar
Microsoft Certified Professional

Attachment: AlgoDeAtributos.rar
Description: Binary data

Responder a