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
AlgoDeAtributos.rar
Description: Binary data