![](/img/trans.png)
[英]C# Cannot create an instance because Type.ContainsGenericParameters is 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.