2010-07-20 15 views
22

Tengo el siguiente atributo personalizado, que puede ser aplicado sobre las propiedades:atributo personalizado en la propiedad - Conseguir tipo y valor de la propiedad atribuida

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public class IdentifierAttribute : Attribute 
{ 
} 

Por ejemplo:

public class MyClass 
{ 
    [Identifier()] 
    public string Name { get; set; } 

    public int SomeNumber { get; set; } 
    public string SomeOtherProperty { get; set; } 
} 

también habrá otras clases, a las que se podría agregar el atributo Identificador a las propiedades de tipo diferente:

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

    [Identifier()] 
    public int SomeNumber { get; set; } 

    public string SomeOtherProperty { get; set; } 
} 

Necesito poder obtener esta información en mi clase de consumo. Por ejemplo:

public class TestClass<T> 
{ 
    public void GetIDForPassedInObject(T obj) 
    { 
     var type = obj.GetType(); 
     //type.GetCustomAttributes(true)??? 
    } 
} 

Cuál es la mejor manera de ir sobre esto? Necesito obtener el tipo del campo [Identificador()] (int, cadena, etc.) y el valor real, obviamente basado en el tipo.

Respuesta

30

algo como lo siguiente ,, esto va a usar sólo la primera propiedad que viene a través que tiene el atributo, por supuesto que podría colocarlo en más de un ..

public object GetIDForPassedInObject(T obj) 
    { 
     var prop = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance) 
        .FirstOrDefault(p => p.GetCustomAttributes(typeof(IdentifierAttribute), false).Count() ==1); 
     object ret = prop !=null ? prop.GetValue(obj, null) : null; 

     return ret; 
    } 
+0

gracias - puede' T uso "prop" dentro de la lambda en FirstOrDefault, pero lo he ordenado :-) – Alex

+0

Ahh sí, estaba escribiendo en el bloc de notas ;-) corregido. –

+1

He marcado mi propiedad con [Identificador()] pero .GetProperties() devuelve todas las demás propiedades, EXCEPTO esta? mi atributo parece ocultarlo ?? – Alex

2
public class TestClass<T> 
{ 
    public void GetIDForPassedInObject(T obj) 
    { 
     PropertyInfo[] properties = 
      obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);    

     PropertyInfo IdProperty = (from PropertyInfo property in properties 
          where property.GetCustomAttributes(typeof(Identifier), true).Length > 0 
          select property).First(); 

     if(null == IdProperty) 
      throw new ArgumentException("obj does not have Identifier."); 

     Object propValue = IdProperty.GetValue(entity, null) 
    } 
} 
Cuestiones relacionadas