我正在尝试为模糊断开的实体图构建一个通用方法。因此,我正在尝试验证实体是否存在,以进行适当的状态修改
private static void ApplyChanges<TEntity>(TEntity root)
where TEntity : class, IObjectWithState
{
using (var context = new MainContext())
{
context.Set<TEntity>().Add(root);
CheckForEntitiesWithoutStateInterface(context);
var entries = context.ChangeTracker.Entries<IObjectWithState>();
foreach (var entry in entries)
{
//Here i try to get the type in my entries that are being tracked
var type = ObjectContext.GetObjectType(entry.Entity.GetType());
//context.Set<type> not regonizing the type correct.
var entity = context.Set<type>();
提前致谢
答案 0 :(得分:1)
您无法使用Type
类型的变量调用泛型方法。相反,您需要通过反射调用该方法。例如:
var setMethod = context.GetType().GetMethod("Set").GetGenericMethodDefinition();
var setMethodForType = setMethod.MakeGenericMethod(type);
var entity = setMethodForType.Invoke(context, new object[0]);
不幸的是,此时实体将是object类型,因此对它的进一步操作也需要反射。解决这个问题的一种方法是创建自己的通用方法,然后反思性地调用它,这样你就可以回到“类型安全”的世界:
var doStuffMethod = [current type].GetMethod("DoStuff", BindingFlags.NonPublic | BindingFlags.Static)
.GetGenericMethodDefinition()
.MakeGenericMethod(type);
doStuffMethod.Invoke(null, new object[] { context });
private static void DoStuff<TEntity>(MainContext context) {
// here you can do
context.Set<TEntity>();
}
答案 1 :(得分:1)
非通用方法DbContext.Set怎么样?