2011-09-12 14 views
5

Estoy aprendiendo los conceptos de reflexiones en C#. Tengo una clase como estaPregunta simple: Reflexiones en C#

public class pdfClass 
{ 
    public List<AttributeProperties> TopA { get; set; } 
    public List<AttributeProperties> TopB { get; set; } 
    public List<AttributeProperties> TopC { get; set; } 

} 

En otra clase me gustaría extraer los valores de la lista. Tengo maneras estúpidas que hacerlo así

public void ExtractValue (pdfClass incomingpdfClass, string type) 
{ 
switch (type) 
{ 
    case "TopA": 
    foreach (var listitem in incomingPdfClass.TopA) 
    {...} 
    breaks; 
    case "TopB": 
    foreach (var listitem in incomingPdfClass.TopB) 
    {...} 
    breaks; 
    ... 
} 
} 

Las operaciones en las foreach son similares. ¿Cómo puedo hacer esto de una manera clara mediante el uso de reflexiones?

+2

¿Por qué utilizar la reflexión para este ? –

+2

Esta pregunta no es lo suficientemente clara. El código que publicaste, específicamente el segundo ejemplo, no se compilaría (una declaración de cambio no puede estar en una clase). En la clase ExtractValue, ¿cómo obtiene referencias a las propiedades TopA, TopB, etc.? ¿Hereda de pdfClass? Necesitamos un mejor ejemplo para comenzar. –

+0

@Seen: ¿Tiene una instancia de pdfClass? – sll

Respuesta

7
public void ExtractValue(pdfClass incomingpdfClass, string type) 
{ 
    PropertyInfo pinfo = typeof(pdfClass).GetProperty("Top" + type); 
    var yourList = pinfo.GetValue(incomingpdfClass); 
    foreach (var listitem in yourList) 
    { ... } 
} 

Así es como debes hacerlo usando la reflexión. Sin embargo, debe tener en cuenta que mi código difiere del suyo en el hecho de que está escribiendo código que no es claro ni compilaría. AS

public class ExtractValue (pdfClass incomingpdfClass, string type) 

es # sintaxis no válida C si eso se supone que es una función de acuerdo con mi ejemplo que esto funcionará para usted

O si esto se supone que sucederá en el Constructor para la clase que debe ser de la siguiente manera

public class ExtractValue 
{ 
    public ExtractValue(pdfClass incomingpdfClass, string type) 
    { 
    PropertyInfo pinfo = typeof(pdfClass).GetProperty("Top" + type); 
    var yourList = pinfo.GetValue(incomingpdfClass); 
    foreach (var listitem in yourList) 
    { ... } 
    } 
} 
+0

Gracias por su respuesta ... Traté de hacerlo más claro en mi declaración de preguntas. – Seen

+0

@Seen su código aún no es válido, pero estoy extendiendo mi ejemplo para ayudar – msarchet

+0

Muchas gracias .... no se ha publicado en stackoverflow durante mucho tiempo y cometió muchos errores estúpidos. – Seen

1
var property = this.GetType().GetProperty(type); 
foreach (var item in (List<AttributeProperties>)property.GetValue(this, null)) 
{ 

} 
1

Si tiene instancia de pdfClass que no es necesario utilizar la reflexión para acceder a las listas. sugeriría a desacoplar el tipo de estrategia en sí misma por la persistencia de un diccionario como:

IDictionary<string, Func<pdfClass, AttributeProperties, bool>> strategy; 

agregar una vez que las relaciones como

strategy.Add("TopA", (pdf, item) => 
       { 
       return pdf.TopA.IndexOf(item) >= 0; 
       }); 

y utilizar como

string itemType = "TopA"; 
if (strategy.ContainsKey(itemType)) 
{ 
    bool found = strategy[itemType](incommingPdfClass, listItem); 
} 
+0

¡Gracias! Lo intentaré más tarde. – Seen

+0

@Seen: gritar aquí en caso de cualquier pregunta – sll