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
