使用反射,在已存在的对象上调用Field的方法

jda*_*vis 5 .net c# reflection entity-framework

我有一个名为AccessData的类的实例,它继承自DbContext.所以它是一个实体框架代码第一个上下文类,看起来像这样......

public class AccessData : DbContext
{
    public DbSet<apps_Apps> apps_AppsList;
    public DbSet<apps_AppsOld> apps_AppsOldList;
    ...
    //Several other DbSet<> properties
}
Run Code Online (Sandbox Code Playgroud)

使用Reflections,我已经在AccessData对象上找到了这些DbSet属性之一,就像这样......

var listField = accessData.GetType().GetField(typeName + "List");
Run Code Online (Sandbox Code Playgroud)

我现在需要能够向此DbSet属性添加对象.

鉴于我只有一个表示DbSet字段的FieldInfo对象,如何在AccessData对象上调用此特定Field的Add方法并传入一个对象?

或者换句话说,如何调用以下内容?

accessData.<FieldInfoType>.Add(obj);
Run Code Online (Sandbox Code Playgroud)

希望这是有道理的.

M.B*_*ock 8

获得该字段的值:

object fldVal = listField.GetValue(accessData);
Run Code Online (Sandbox Code Playgroud)

获取MethodInfo要调用的方法:

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

并调用它:

addMethod.Invoke(fldVal, new object[] { obj });
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用的是.NET 4,则可以使用new dynamic关键字来简化最后两个步骤:

dynamic fldVal = listField.GetValue(accessData);
fldVal.Add(obj);
Run Code Online (Sandbox Code Playgroud)