2017-10-28 1 views
-1

enter image description here는 Type.ContainsGenericParameters 내가 동적으로 인스턴스를 생성 반사를 사용하고

사실 때문에의 인스턴스를 만들 수 없습니다.

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

내 예외는 다음입니다 : - 는 "Type.ContainsGenericParameters 사실 때문에 CGenericConfigurationClass`1 [T]의 인스턴스를 만들 수 없습니다."

+0

이미지가 전혀 도움이되지 않습니다. 그것을 제거하고 대신 코드를 보여주십시오. 또한 EF에는 어셈블리에서 'EntityTypeConfiguration'클래스를 검색 할 수있는 내장 함수가 있습니다. –

+0

정확한 코드를 얻기 위해 실시간 이메일을 제공하십시오. –

+0

ef의 EntityTypeConfiguration 클래스를 사용하여 다중 레벨 상속을 사용하려고합니다. 어떤 아이디어 나 해결책을 알려주십시오. –

답변

1

의 유형 중 하나가 제네릭 형식이고 제네릭 형식 매개 변수를 지정하지 않고 해당 형식의 인스턴스를 만들려고합니다. 예를 들어, 이것은 List<>의 인스턴스를 만들려고했지만 꺽쇠 괄호 <> 사이에 유형을 제공하지 않는 것과 같습니다. 이것은 불가능합니다. Activator.CreateInstance()에 "일반 제네릭 유형"을 지정해야합니다.

이 작업을 수행하려면 다음과 같이 할 수 있지만 예제를 기반으로하면 많은 구성 인스턴스를 만들어야 할 일반 사용자 유형을 전달할 필요가 있으므로 매우 유용하다고 생각하지 않습니다 에.

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

내 생각 엔 당신이 기대했던 것보다 typesTR 그것에 더 많은 종류를 가지고 있다는 것입니다 및 제네릭 기본 클래스 중 하나가 포함되어 있습니다. DClass와 EClass 만 포함해야한다고 생각하지만 기본 클래스 중 하나를 포함합니다.

+0

sir 난 엔터티 프레임 워크의 EntityTypeConfiguration 클래스를 사용하여 다중 레벨 상속을 사용하고 싶습니다. 위의 사진은 주요 시나리오를 보여줍니다. 나에게 어떤 아이디어 나 해결책을주십시오. –

관련 문제