2011-05-12 11 views
9

¿Hay alguna herramienta, biblioteca que me permita acceder al estilo del indexador de propiedades de mis objetos?C# Acceso al estilo del indexador de propiedades del objeto

public class User 
{ 
    public string Name {get;set;} 
} 

User user = new User(); 
user.Name = "John"; 

string name = user["Name"]; 

Tal vez la palabra clave dinámica podría ayudarme aquí?

+1

Fuera de interés. ¿Por qué querrías hacer esto alguna vez? –

+0

Estoy tratando de crear una forma genérica para hacer algunas cosas de informes. – user256034

Respuesta

3

Consulte this sobre indexadores. El diccionario almacena todos los valores y claves en lugar de usar propiedades. De esta manera puede agregar nuevas propiedades en tiempo de ejecución sin perder el rendimiento

public class User 
{ 
    Dictionary<string, string> Values = new Dictionary<string, string>(); 
    public string this[string key] 
     { 
      get 
      { 
       return Values[key]; 
      } 
      set 
      { 
       Values[key] = value; 
      } 
     } 
} 
+0

Hay muchos objetos por lo que implementar esto para cada objeto no es una opción. – user256034

+0

@ user256034 Solo lo hace una vez y almacena los valores en el diccionario en lugar de las propiedades. –

0

Puede construirlo usted mismo con la reflexión y el indexador.

¿Pero para qué necesita una solución de este tipo?

10

Puede utilizar la reflexión para obtener el valor de la propiedad por su nombre

PropertyInfo info = user.GetType().GetProperty("Name"); 
    string name = (string)info.GetValue(user, null); 

Y si desea utilizar el índice para ello se puede intentar algo así como que

public object this[string key] 
    { 
     get 
     { 
      PropertyInfo info = this.GetType().GetProperty(key); 
      if(info == null) 
       return null 
      return info.GetValue(this, null); 
     } 
     set 
     { 
      PropertyInfo info = this.GetType().GetProperty(key); 
      if(info != null) 
       info.SetValue(this,value,null); 
     } 
    } 
+1

¿No afectaría esto mi rendimiento? – user256034

+1

@ user256034 Mucho sería. Pero encontrar una propiedad en tiempo de ejecución es muy lento. La única manera de hacerlo rápido es con mi implementación –

+0

No es tanto como usar una dinámica. Las dinámicas se compilan esencialmente en tiempo de ejecución según sea necesario. –

1

No se puede hacer esto hasta que el clase implementa un indexador.

2

Sin duda podría heredar DynamicObject y hacerlo de esa manera.

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetindex.aspx

Utilizando el método paso a paso sencillo mencionado aquí por otros limitaría a que ya sea devolviendo sólo 'objeto' (y tener que fundido) o de presentar únicamente los tipos de cadena en su clase.

Editar: Como se mencionó en otras partes, incluso con la dinámica, todavía necesita usar ya sea reflexión o alguna forma de búsqueda para recuperar el valor dentro de la función TryGetIndex.

+0

podría por favor mostrar un ejemplo? – user256034

+0

@ user256034 El enlace de arriba tiene un ejemplo decente. –

1

Si lo que desea es acceder a una propiedad basada en un valor de cadena que podría utilizar la reflexión para hacer algo similar:

string name = typeof(User).GetProperty("Name").GetValue(user,null).ToString(); 
Cuestiones relacionadas