Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法从条目中获取类型。实体_C#_Entity Framework - Fatal编程技术网

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>();
}