无法创建实例,因为Type.ContainsGenericParameters为true

时间:2017-10-28 12:21:38

标签: c# generics entity-framework-6

enter image description here

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

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为真。”

2 个答案:

答案 0 :(得分:4)

看起来cmake_minimum_required(VERSION 3.8) project(MyLibConsumer VERSION 1.0.0 LANGUAGES CXX) set(LIB_INSTALL_DIR ${CMAKE_BINARY_DIR}/thirdparty/mylib) include(ExternalProject) ExternalProject_Add(MyLibExternal PREFIX "${CMAKE_BINARY_DIR}/external/mylib" GIT_REPOSITORY "https://github.com/arteniioleg/stackoverflow-question-46772541.git" GIT_TAG "mylib" CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIB_INSTALL_DIR} ) if(NOT EXISTS ${LIB_INSTALL_DIR}/lib) # Happens on first CMake run. # Can't continue because the below `find_package(REQUIRED)` will fail. # Build all external project targets then rerun CMake and build the project target. message(AUTHOR_WARNING "Build all external projects then reload cmake.") return() endif() add_executable(${PROJECT_NAME} main.cpp) set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED YES CXX_EXTENSIONS NO ) add_dependencies(${PROJECT_NAME} MyLibExternal) find_package(MyLib REQUIRED HINTS ${LIB_INSTALL_DIR}) target_link_libraries(${PROJECT_NAME} PRIVATE MyLib) 中的一个类型是泛型类型,并且您尝试创建该类型的实例而不指定泛型类型参数。例如,这就好像您尝试创建typesTR的实例但没有在尖括号&lt;&gt;之间提供类型。这是不可能的,List<>必须被赋予“封闭的通用类型”。

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

Activator.CreateInstance()

我的猜测是var t = type.MakeGenericType(typeof(SomeClassToBeUsedAsGenericTypeParameter)); dynamic configurationInstance = Activator.CreateInstance(t); ... 中的类型比你预期的要多,并且包含一个通用的基类。我认为它应该只包括DClass和EClass,但它包括一个基类。

答案 1 :(得分:0)

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

render(){
    return(
     <div>
     ...
     </div>)
   }