2012-02-10 8 views
5

Ho un'istanza di una classe denominata AccessData, che eredita da DbContext. Quindi si tratta di un codice di prima classe del contesto Entity Framework e si presenta così ...Utilizzando la riflessione, chiamare un metodo di un campo su un oggetto già esistente

public class AccessData : DbContext 
{ 
    public DbSet<apps_Apps> apps_AppsList; 
    public DbSet<apps_AppsOld> apps_AppsOldList; 
    ... 
    //Several other DbSet<> properties 
} 

Utilizzando Riflessioni, ho identificato una di queste proprietà DbSet sull'oggetto AccessData come questo ...

var listField = accessData.GetType().GetField(typeName + "List"); 

Ora devo essere in grado di aggiungere oggetti a questa proprietà DbSet.

Dato che ho solo un oggetto FieldInfo che rappresenta il campo DbSet, come posso chiamare il metodo Aggiungi di questo campo particolare sull'oggetto AccessData e passare un oggetto?

O in altre parole, come posso chiamare quanto segue?

accessData.<FieldInfoType>.Add(obj); 

Spero che questo abbia senso.

risposta

8

Prendi il valore del campo:

object fldVal = listField.GetValue(accessData); 

Prendi il MethodInfo per il metodo che si desidera richiamare:

MethodInfo addMethod = fldVal.GetType().GetMethod("Add", new Type[] { typeof(obj) }); 

E invocarlo:

addMethod.Invoke(fldVal, new object[] { obj }); 

Oppure, se siete utilizzando .NET 4, potresti essere in grado di utilizzare la nuova parola chiave dynamic per semplificare gli ultimi 2 passaggi:

dynamic fldVal = listField.GetValue(accessData); 
fldVal.Add(obj); 
+0

Quindi questo funziona perché GetValue restituisce un riferimento all'oggetto a cui fa riferimento fieldInfo? Ho assunto dal nome che GetValue ha appena restituito un valore piuttosto che l'oggetto stesso o qualcosa del genere. –

+0

@MatthewLock - Non sono abbastanza sicuro di capire cosa _value_ ti aspetti di ottenere. 'GetValue()' restituirà tutto ciò che verrebbe normalmente restituito dereferenziando il campo (ad esempio 'fldVal = obj.ListField;') –

+0

Quello che non capisco è il motivo per cui è possibile chiamare GetType() sull'oggetto valore restituito e essere in grado per ottenere un metodoInfo sull'oggetto che ha restituito il valore e quindi raggiungere l'istanza dell'oggetto utilizzando Invoke. È fantastico che funzioni così, ma sembra strano. –

Problemi correlati