2012-01-20 25 views
5

, así que tengo una colección de Propiedades de mi clase en la que quiero pasar. Para cada propiedad, puedo tener atributos personalizados, así que quiero recorrerlos. En este caso particular que tienen un atributo personalizado en mi clase de la ciudad como talC# Atributos personalizados de las Propiedades

public class City 
{ 
    [ColumnName("OtroID")] 
    public int CityID { get; set; } 
    [Required(ErrorMessage = "Please Specify a City Name")] 
    public string CityName { get; set; } 
} 

El atributo se define como tal

[AttributeUsage(AttributeTargets.All)] 
public class ColumnName : System.Attribute 
{ 
    public readonly string ColumnMapName; 
    public ColumnName(string _ColumnName) 
    { 
     this.ColumnMapName= _ColumnName; 
    } 
} 

Cuando trato de bucle a través de las propiedades [que funciona muy bien] y luego recorre los atributos simplemente ignora el ciclo for para el atributo y no devuelve nada.

foreach (PropertyInfo Property in PropCollection) 
//Loop through the collection of properties 
//This is important as this is how we match columns and Properties 
{ 
    System.Attribute[] attrs = 
     System.Attribute.GetCustomAttributes(typeof(T)); 
    foreach (System.Attribute attr in attrs) 
    { 
     if (attr is ColumnName) 
     { 
      ColumnName a = (ColumnName)attr; 
      var x = string.Format("{1} Maps to {0}", 
       Property.Name, a.ColumnMapName); 
     } 
    } 
} 

Cuando voy a la ventana inmediata para la propiedad que tiene un atributo personalizado que pueda hacer

?Property.GetCustomAttributes(true)[0] 

Se volverá ColumnMapName: "OtroID"

Me parece que no puede adaptarse a este trabajo programáticamente aunque

+1

Como nota al margen: Por convención, la clase de atributo debe ser llamado 'ColumnNameAttribute'. – Heinzi

+3

Apenas por interés, ¿qué es 'T' en' typeof (T) '? En la ventana inmediata está llamando a Property.GetCustomAttribute (true) [0] pero dentro del bucle foreach está llamando a GetCustomattributes en un parámetro de tipo en su lugar –

+0

No veo una sobrecarga de Attribute.GetCustomAttributes() que acepte solo un parámetro Type.¿Estás seguro de que la línea donde recuperas los atributos es la correcta? – JMarsch

Respuesta

2

Repost de comentarios de pregunta original, por lo autores solicitan

Solo por curiosidad lo es T en typeof (T)?

En la ventana inmediata está llamando a Property.GetCustomAttribute (true) [0], pero dentro del bucle foreach está llamando a GetCustomattributes en un parámetro de tipo en su lugar.

Esta línea:

System.Attribute[] attrs = System.Attribute.GetCustomAttributes(typeof(T)); 

debería ser esta

System.Attribute[] attrs = property.GetCustomAttributes(true); 

Saludos,

8

Quiere hacer esto Creo:

PropertyInfo[] propCollection = type.GetProperties(); 
foreach (PropertyInfo property in propCollection) 
{ 
    foreach (var attribute in property.GetCustomAttributes(true)) 
    { 
     if (attribute is ColumnName) 
     { 
     } 
    } 
} 
1

En el aspecto interno, debe investigar las Propiedades, no el tipo de (T).

Utilice intellisense y observe los métodos que puede invocar desde los objetos de propiedades.

Property.GetCustomAttributes (Boolean) podría ser importante para usted. Esto devolverá una matriz, y puede usar LINQ en ella para devolver rápidamente todos los atributos que coincidan con sus requisitos.

1

Recibí este código para terminar con el valor de x siendo "OtroID Maps to CityID".

var props = typeof(City).GetProperties(); 
foreach (var prop in props) 
{ 
    var attributes = Attribute.GetCustomAttributes(prop); 
    foreach (var attribute in attributes) 
    { 
     if (attribute is ColumnName) 
     { 
      ColumnName a = (ColumnName)attribute; 
      var x = string.Format("{1} Maps to {0}",prop.Name,a.ColumnMapName); 
     } 
    } 
} 
Cuestiones relacionadas