【问题标题】:Cannot create an instance of because Type.ContainsGenericParameters is true无法创建 的实例,因为 Type.ContainsGenericParameters 为 true
【发布时间】:2018-09-09 17:47:55
【问题描述】:

我正在使用反射动态创建一个实例。

var typesTR = Assembly.GetAssembly(typeof(BGenericConfigurationClass<>)).GetTypes()
            .Where(type =>
                    !string.IsNullOrEmpty(type.Namespace) &&
                    (type.Namespace == "EntitiesConfiguration"))
            .Where(type => type.BaseType != null
                           && type.BaseType.IsGenericType
                           &&
                           (type.BaseType.GetGenericTypeDefinition() == typeof(BGenericConfigurationClass<>) ||
                            type.BaseType.GetGenericTypeDefinition() == typeof(CGenericConfigurationClass<>) ));

foreach (var type in typesTR)
{

    dynamic configurationInstance = Activator.CreateInstance(type);
    modelBuilder.Configurations.Add(configurationInstance);
}

enter image description here

我的例外如下:- “无法创建 CGenericConfigurationClass`1[T] 的实例,因为 Type.ContainsGenericParameters 为真。”

【问题讨论】:

  • 图片一点用都没有。请删除它并改为显示代码。另外请注意,EF 有一个内置函数来发现程序集中的EntityTypeConfiguration 类。
  • 我想使用 ef 的 EntityTypeConfiguration 类来使用多级继承。给我任何想法或任何解决方案。
  • 给我... 从语言上讲,这是命令式的,或“命令式”。在每个人都自愿帮助他人的 Stack Overflow 上效果不佳。其中一位志愿者正确地向您解释了您需要type.MakeGenericType——您没有对此做出任何实质性回应。同样,我怀疑您正在尝试重新发明 EF already provides 的轮子,但您也没有对此做出回应。
  • 很抱歉,如果您觉得我的选词有误,但我告诉您英语是您的母语,但我在写作前转换了每句话.. 我不是在命令我非常感谢您回复并分享我的问题解决方案,谢谢先生或兄弟采取任何你喜欢的话。我对行为错误感到内疚和羞耻...请分享我分享整个项目的Skype或电子邮件地址。
  • 没有难过的感觉,只是解释一下 SO 的工作原理。但我也要求对迄今为止提出的建议作出回应。

标签: c# generics entity-framework-6


【解决方案1】:

看起来typesTR 中的一种类型是泛型类型,您正在尝试创建该类型的实例而不指定泛型类型参数。例如,这就像您尝试创建List&lt;&gt; 的实例,但没有在尖括号 之间提供类型。这是不可能的,Activator.CreateInstance() 必须被赋予一个“封闭的泛型”。

为此,您可以执行以下操作,但根据您的示例,我认为这不会很有用,因为您需要创建大量配置实例并且您可能不知道要传入什么泛型类型.

var t = type.MakeGenericType(typeof(SomeClassToBeUsedAsGenericTypeParameter));
dynamic configurationInstance = Activator.CreateInstance(t);
...

我的猜测是typesTR 中的类型比您预期的要多,并且包含一个通用的基类。我认为它应该只包括 DClass 和 EClass,但包括基类之一。

【讨论】:

  • 先生,我想使用实体框架的 EntityTypeConfiguration 类来使用多级继承。上图显示主要场景给我任何想法或任何解决方案
【解决方案2】:

在我的情况下,这当然是不同的,但也与问题中提出的问题有一些相似之处,我设法通过使用以下代码使我的部分实体映射在 EF 中通用

 protected override void OnModelCreating(ModelBuilder builder)
 {
     RegisterMaps(builder);
     base.OnModelCreating(builder);
 }

 private static void RegisterMaps(ModelBuilder builder)
 {
     var mapLists = Assembly.GetExecutingAssembly().GetTypes()
            .Where(type => !string.IsNullOrWhiteSpace(type.Namespace)
                && typeof(IEntityMap).IsAssignableFrom(type) 
                && type.IsGenericType == false 
                && type.IsClass).ToList();

     foreach (var item in mapLists)
     {
         Activator.CreateInstance(item, BindingFlags.Public | 
         BindingFlags.Instance, null, new object[] { builder }, null);
     }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 2021-04-12
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多