C# 使用反射,在已经存在的对象上调用字段的方法

C# 使用反射,在已经存在的对象上调用字段的方法,c#,.net,entity-framework,reflection,C#,.net,Entity Framework,Reflection,我有一个名为AccessData的类的实例,它继承自DbContext。所以它是一个实体框架代码第一个上下文类,看起来像这样 public class AccessData : DbContext { public DbSet<apps_Apps> apps_AppsList; public DbSet<apps_AppsOld> apps_AppsOldList; ... //Several other DbSet<> pro

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

public class AccessData : DbContext
{
    public DbSet<apps_Apps> apps_AppsList;
    public DbSet<apps_AppsOld> apps_AppsOldList;
    ...
    //Several other DbSet<> properties
}
var listField = accessData.GetType().GetField(typeName + "List");
我现在需要能够将对象添加到这个DbSet属性

假设我只有一个表示DbSet字段的FieldInfo对象,那么如何在AccessData对象上调用这个特定字段的Add方法并传入一个对象

或者换言之,我如何称呼以下内容

accessData.<FieldInfoType>.Add(obj);
accessData..Add(obj);
希望这有意义。

获取字段的值:

object fldVal = listField.GetValue(accessData);
获取要调用的方法的
MethodInfo

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

addMethod.Invoke(fldVal, new object[] { obj });
或者,如果您使用的是.NET 4,则可以使用新的
dynamic
关键字简化最后两个步骤:

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

这是因为GetValue返回对fieldInfo所引用对象的引用?我从名称中假设GetValue只是返回了一个值,而不是对象本身或其他东西。@MatthewLock-我不太清楚您希望得到什么值
GetValue()
将返回通常通过取消引用字段而返回的任何内容(例如
fldVal=obj.ListField;
),我不明白的是,为什么可以对返回的值对象调用GetType(),并能够获取返回值的对象的methodInfo,然后使用Invoke到达对象的实例。这样工作很好,但看起来很奇怪。