2011-09-12 12 views
5

Sto imparando i concetti di riflessioni in C#. Ho una classe come questaDomanda semplice: Riflessioni in C#

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

} 

In un'altra classe vorrei estrarre i valori dall'elenco. Ho modi stupidi per farlo come

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

Le operazioni nei cicli di foreach sono simili. Come posso farlo in modo chiaro usando i riflessi?

+2

Perché si utilizzare la riflessione per questa ? –

+2

Questa domanda non è abbastanza chiara. Il codice che hai postato, in particolare il secondo esempio, non verrebbe compilato (un'istruzione switch non può essere in una classe). Nella classe ExtractValue, come si ottengono i riferimenti alle proprietà TopA, TopB, ecc.? Eredita da pdfClass? Abbiamo bisogno di un esempio migliore per iniziare. –

+0

@Seen: hai un'istanza di pdfClass? – sll

risposta

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

Questo è come si dovrebbe fare questo utilizzando la riflessione. Tuttavia, dovresti notare che il mio codice è diverso dal tuo nel fatto che stai scrivendo un codice che non è chiaro né verrebbe compilato. AS

public class ExtractValue (pdfClass incomingpdfClass, string type) 

è C# sintassi non valida se che dovrebbe essere una funzione come per il mio esempio questo sarà il lavoro per voi

Oppure, se questo dovrebbe accadere nel Constructor per la classe dovrebbe apparire come segue

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

Grazie per la tua risposta ... Ho provato a chiarire meglio la mia domanda. – Seen

+0

@Se il tuo codice non è ancora valido, ma sto estendendo il mio esempio per aiutare – msarchet

+0

Grazie mille .... non ho postato su StackOverflow per un lungo periodo e ho fatto un sacco di errori stupidi. – Seen

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

} 
1

Se si dispone di un'istanza di pdfClass non è necessario utilizzare la riflessione per l'accesso liste. Vorrei suggerire di separare il tipo di strategia stessa persistendo tale dizionario:

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

Una volta aggiungere le relazioni come

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

e utilizzare come

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

Grazie! Proverò in questo modo più tardi. – Seen

+0

@Seen: urlate qui in caso di domande – sll