EntityType'是变量,但在使用反射时就像类型一样使用

时间:2019-04-02 10:18:19

标签: c# reflection entity-framework-6

我需要在DbContext中注册所有实体。

我创建了一个extention,用于使用Reflection自动注册所有实体:

  public static void RegisterAllEntity<BaseType>(this DbModelBuilder builder, params Assembly[] assmblies)
    {
        IEnumerable<Type> types = assmblies.SelectMany(x => x.GetExportedTypes())
            .Where(x => x.IsClass && !x.IsAbstract && x.IsPublic && typeof(BaseType).IsAssignableFrom(x));

        foreach (Type EntityType in types)
            builder.Entity<EntityType>();
    }

但是它显示了这个错误:

  

EntityType'是一个变量,但像类型一样使用

在此行:

    foreach (Type EntityType in types)
            builder.Entity<EntityType>();

出什么问题了?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

查看文档,我认为您想使用DbModelBuilder.RegisterEntityType而不是DbModelBuilder.Entity。前者的文档说:

  

提供此方法是为了方便,以允许动态注册实体类型,而无需使用MakeGenericMethod来调用普通的通用Entity方法。

因此,您可以使用builder.Entity<EntityType>();而不是builder.RegisterEntityType(EntityType);

值得一提的是,在这种情况下,通常会使用一个非通用方法来代替Type对象,因此,如果以后在其他软件中发现这种情况,请检查该非通用方法带有Type参数的方法。

答案 1 :(得分:1)

在编译过程中,通用参数必须是可解析的。您需要在这种循环中使用反射来调用Entity方法。请检查this答案。

用法示例

...
MethodInfo method = typeof(DbModelBuilder).GetMethod("Entity");
MethodInfo generic = method.MakeGenericMethod(EntityType);
generic.Invoke(builder, null);

编辑:

与克里斯mentioned一样,也不需要使用反射,因为DbModelBuilder提供了RegisterEntityType方法,该方法接受Type作为参数,例如:

builder.RegisterEntityType(EntityType);

EDIT2:有克里斯(Chris)answer

答案 2 :(得分:1)

您可以在每个foreach周期中将EntityType用作变量,并在builder.Entity<EntityType>()中将EntityType用作类型。例如,将变量名称从EntityType更改为EntityType,以便C#编译器可以理解您的代码