2017-10-28 3 views
-1

enter image description hereはType.ContainsGenericParametersは私が動的にインスタンスを作成するリフレクションを使用しています

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

enter image description here

と私の例外は以下の通りです: - は "Type.ContainsGenericParametersが真であるのでCGenericConfigurationClass`1 [T]のインスタンスを作成できません。"

+0

画像が役に立たない。削除してコードを表示してください。また、EFにはアセンブリ内の 'EntityTypeConfiguration'クラスを発見する組み込み関数があります。 –

+0

は、正確なコードを取得するためのライブメールを提供します。 –

+0

私は、efのEntityTypeConfigurationクラスを使用してマルチレベルの継承を使用したいと考えています。アイデアや解決策を教えてください。 –

答えて

1

typesTRのタイプの1つがジェネリックタイプで、ジェネリックタイプパラメータを指定せずにそのタイプのインスタンスを作成しようとしているようです。例として、これはList<>のインスタンスを作成しようとしていたものの、角括弧<>の間に型を指定しない場合と同じです。これは可能ではありません。Activator.CreateInstance()には "クローズジェネリック型"を指定する必要があります。

これを行うには、次のようなことができますが、例に基づいて、多数の構成インスタンスを作成する必要があり、どの汎用型を渡すべきかわからないため、 。

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

に私の推測では、typesTRはあなたが期待していたよりも、その中の多くの種類があり、一般的なものであり基底クラスの1つを含むことです。私はそれがDClassとEClassだけを含むべきだと思うが、基本クラスの1つを含んでいると思う。

+0

私はエンティティフレームワークのEntityTypeConfigurationクラスを使用してマルチレベルの継承を使用したいと思います。上記の画像は主なシナリオを示してくれます。 –

関連する問題