2011-09-12 4 views
5

J'apprends les concepts de réflexions en C#. J'ai une classe comme ceciSimple question: Réflexions en C#

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

} 

Dans une autre classe je voudrais extraire les valeurs de la liste. J'ai des façons stupides de le faire comme

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; 
    ... 
} 
} 

Les opérations dans les boucles foreach sont similaires. Comment puis-je le faire de manière claire en utilisant des réflexions?

+2

Pourquoi utiliseriez-vous la réflexion pour cette ? –

+2

Cette question n'est pas assez claire. Le code que vous avez publié, en particulier le second exemple, ne serait pas compilé (une instruction switch ne peut pas être dans une classe). Dans la classe ExtractValue, comment obtenez-vous des références aux propriétés TopA, TopB, etc? Est-ce qu'il hérite de pdfClass? Nous avons besoin d'un meilleur exemple pour commencer. –

+0

@Seen: Avez-vous une instance de pdfClass? – sll

Répondre

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) 
    { ... } 
} 

Voici comment vous devriez le faire en utilisant la réflexion. Cependant, vous devriez noter que mon code diffère du vôtre dans le fait que vous écrivez du code qui n'est pas clair et ne le compilerait pas. AS

public class ExtractValue (pdfClass incomingpdfClass, string type) 

est non valide C syntaxe # si cela est censé être une fonction par mon exemple, cela fonctionnera pour vous

Ou si cela est censé se produire dans le Constructor pour la classe qu'il devrait regarder comme suit

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

Merci pour votre réponse ... J'ai essayé de le rendre plus clair dans mon énoncé de question. – Seen

+0

@Seen votre code n'est toujours pas valide, mais je suis d'étendre mon exemple pour aider – msarchet

+0

Merci beaucoup .... n'ont pas posté sur stackoverflow depuis longtemps et fait beaucoup d'erreurs stupides. – Seen

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

} 
1

Si vous avez par exemple de pdfClass vous n'avez pas besoin d'utiliser la réflexion pour accéder à la liste. Je suggère de découpler type lui-même de la stratégie par la persistance d'un tel dictionnaire:

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

Une fois ajouter des relations comme

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

et utiliser comme

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

Merci! Je vais essayer de cette façon plus tard. – Seen

+0

@Seen: crier ici en cas de questions – sll