2010-08-26 22 views
6

¿Es posible encontrar una clase etiquetada con un atributo personalizado basado en un valor dado a ese atributo?Buscar todas las clases con un atributo que contiene un valor de propiedad específico

Básicamente, tengo clases que se ven así -

[MyAttr("CODE")] 
public class MyClass() {} 

De allí que estoy recibiendo todas las clases (tipos) -

var c = Assembly.GetExecutingAssembly().GetTypes().Where 
         (
          t => t.IsClass && 
          t.Namespace == (typeof(AbstractParentClass)).Namespace && 
          t.IsSubclassOf(typeof(AbstractParentClass)) 
         ); 

Todo esto parece funcionar. c contiene todas las clases apropiadas. Ahora necesito obtener la clase de c que tiene el atributo MyAttr y el valor "CODE". El valor está disponible a través de una propiedad en MyAttr llamada Id.

Este fue mi intento -

var message = from m in c 
        from a in m.GetCustomAttributes(typeof(MyAttr), false) 
        where ((MyAttr)a).Id == "CODE" 
       select m; 

que no hizo el truco. Entonces, la verdadera pregunta es si esto es posible, y si es así, qué necesita ser cambiado para obtener la clase apropiada (y crear una instancia).

+2

Tu código debería funcionar. ¿Estás seguro de que 'c' contiene el tipo que estás buscando? – SLaks

+1

SLaks es correcto y el código debería funcionar. Me pregunto si Assembly.GetExecutingAssembly() siempre devuelve el ensamblado que esperaba. –

+1

Intente reemplazar 'Assembly.GetExecutingAssembly()' con 'typeof (AbstractParentClass) .Assembly'. – SLaks

Respuesta

3

Reemplace Assembly.GetExecutingAssembly() con typeof(AbstractParentClass).Assembly.

Cuestiones relacionadas