簡體   English   中英

無法創建實例,因為Type.ContainsGenericParameters為true

[英]Cannot create an instance of because Type.ContainsGenericParameters is true

在此輸入圖像描述

我正在使用反射動態創建一個實例。

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

在此輸入圖像描述

我的異常如下: - “無法創建CGenericConfigurationClass`1 [T]的實例,因為Type.ContainsGenericParameters為真。”

看起來typesTR中的一個類型是泛型類型,並且您嘗試在不指定泛型類型參數的情況下創建該類型的實例。 例如,這就好像您嘗試創建List<>的實例但沒有在尖括號<>之間提供類型。 這是不可能的, Activator.CreateInstance()必須被賦予“封閉的泛型類型”。

為此,您可以執行以下操作,但基於您的示例,我認為這不會非常有用,因為您需要創建大量配置實例,並且您可能不知道要傳遞的泛型類型。

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

我的猜測是, typesTR類型比你預期的要多,並且包含一個通用的基類。 我認為它應該只包括DClass和EClass,但包含一個基類。

在我的情況下,當然是不同的,但也與問題中提出的問題有一些相似之處,我設法通過使用以下代碼在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);
     }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM