C# 无法从条目中获取类型。实体
我正在尝试建立一个模糊不连通实体图的通用方法。所以我试图验证实体是否存在,以便正确地修改状态C# 无法从条目中获取类型。实体,c#,entity-framework,C#,Entity Framework,我正在尝试建立一个模糊不连通实体图的通用方法。所以我试图验证实体是否存在,以便正确地修改状态 private static void ApplyChanges<TEntity>(TEntity root) where TEntity : class, IObjectWithState { using (var context = new MainContext()) { context.Set<T
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>();
private static void ApplyChanges(TEntity root)
其中tenty:class,IObjectWithState
{
使用(var context=new MainContext())
{
context.Set().Add(根);
使用Outstate接口(上下文)检查实体;
var entries=context.ChangeTracker.entries();
foreach(分录中的var分录)
{
//在这里,我尝试获取正在跟踪的条目中的类型
var type=ObjectContext.GetObjectType(entry.Entity.GetType());
//设置为不重新生成正确的类型。
var entity=context.Set();
提前感谢您不能使用类型为
类型
的变量调用泛型方法。相反,您需要通过反射调用该方法。例如:
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(类型);
Invoke(null,新对象[]{context});
私有静态void DoStuff(主上下文上下文){
//在这里你可以做什么
context.Set();
}
非泛型方法如何?这是正确答案…->context.set(entry.Entity.GetType());
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>();
}