2017-07-20 4 views
0

私は、EntityTypeConfiguration(Entity Framework-ism)のベースを持つアセンブリから型を動的に取得しようとしています。すべての型を取得したら、それぞれのオブジェクトをインスタンス化し、ビルダー(DbModelBuilder)関数に渡します。Activator.CreateInstance - パラメータのないコンストラクタの問題

Sampleクラス:

public class LocationConfiguration : EntityTypeConfiguration<Location> 
{ 
    public LocationConfiguration() 
    { 
     // some basic stuff here 
    } 
} 

私はタイプ何の問題を取得するが、私はこのラインでパラメータなしのコンストラクタエラーを取得:

var result = (dynamic)Activator.CreateInstance(type); 

P.S.この特定の例では、私はただAddFromAssembly()を使うことができると理解していますが、最終的にどのコンフィギュレーションがロードされているのかを選択したいのです。

EDIT:

エラースローラインのハードコードされた例の追加:以下のコードは正確な複製である場合

System.MissingMethodException occurred 
    HResult=0x80131513 
    Message=No parameterless constructor defined for this object. 
    Source=mscorlib 
    StackTrace: 
    at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) 
    at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) 
    at System.Activator.CreateInstance(Type type, Boolean nonPublic) 
    at System.Activator.CreateInstance(Type type) 
    at .OnModelCreating(DbModelBuilder builder) in C:\Development\Context.cs:line 25 
    at System.Data.Entity.Internal.LazyInternalContext.CreateModelBuilder() 
    at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) 
    at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input) 
+1

例外情報を追加できますか? – Markus

+0

私は再び質問を編集しました。上記を参照。 – mtm927

+1

"example"、** specific ** lineはその例外をスローしますか? –

答えて

1

var result = (dynamic)Activator.CreateInstance(typeof(LocationConfiguration)); 

EDIT#2あなたの問題では、答えは "はLocationのインスタンスを独自のコンストラクタ内に作成するためです。"

using System; 

namespace ConsoleApp2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      object thing = Activator.CreateInstance<PublicCtorClass>(); 
     } 
    } 

    class PublicCtorClass : ProtectedCtorGenericClass<PublicParameterisedCtorClass> 
    { 
     public PublicCtorClass() { } 
    } 

    class ProtectedCtorGenericClass<T> 
    { 
     protected ProtectedCtorGenericClass() 
     { 
      object thing = Activator.CreateInstance(typeof(T)); 
     } 
    } 

    class PublicParameterisedCtorClass 
    { 
     public PublicParameterisedCtorClass(object arg) { } 
    } 
} 

そして、その場合には、溶液はEntityTypeConfigurationの子クラスを作成し、new()にそれを制限することに一般的な制約を追加することです。このように:

class ActivatorSafeEntityTypeConfiguration<T> : EntityTypeConfiguration<T> where T : new() 
{ 

} 

希望します。

関連する問題