2012-02-10 24 views
5

Tengo una instancia de una clase llamada AccessData, que hereda de DbContext. Por lo que es un código de primera clase de contexto Marco de la entidad y se ve así ...Usando la reflexión, llame a un método de un campo en un objeto que ya existe

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

Usando Reflexiones, he identificado una de estas propiedades DbSet en el objeto AccessData así ...

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

Ahora necesito poder agregar objetos a esta propiedad DbSet.

Dado que solo tengo un objeto FieldInfo que representa el campo DbSet, ¿cómo llamo al método Agregar de este campo en particular en el objeto AccessData y paso un objeto?

O en otras palabras, ¿cómo puedo llamar a lo siguiente?

accessData.<FieldInfoType>.Add(obj); 

Espero que esto tenga sentido.

Respuesta

8

Obtener el valor del campo:

object fldVal = listField.GetValue(accessData); 

Consigue el MethodInfo para el método que desea invocar:

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

Y lo invocan:

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

O si está utilizando .NET 4, puede usar la nueva palabra clave dynamic para simplificar los últimos 2 pasos:

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

¿Esto funciona porque GetValue devuelve una referencia al objeto al que se refiere el campoInfo? He asumido por el nombre que GetValue acaba de devolver un valor en lugar del objeto en sí o algo así. –

+0

@MatthewLock - No estoy seguro de entender qué _value_ espera obtener. 'GetValue()' devolverá lo que normalmente se devolverá desreferenciando el campo (por ejemplo, 'fldVal = obj.ListField;') –

+0

Lo que no entiendo es por qué puede llamar a GetType() en el objeto de valor devuelto y poder para obtener un methodInfo en el objeto que devolvió el valor, y luego llegar a la instancia del objeto utilizando Invoke. Es genial que funcione así, pero parece extraño. –

Cuestiones relacionadas