Activator.CreateInstance с параметром - конструктор типа дочернего класса не найден - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь передать connectionString в конструктор фабрики контекста, но получаю сообщение об ошибке «Тип конструктора ContextImplementationTest not found» В чем проблема?Я звоню

string bid="someCOnnectionString";
using (BaseContext<DbContext> db = MediaDbContext.GetBidContext(bid)){...}


public static class MediaDbContext
{
   public static BaseContext<DbContext> GetBidContext(string connString)
    {
        //Settings.ContextFactory="ContextImplementationTest"
        Type contextFactoryType = Type.GetType("Media.DB.Context.Implementation." + Settings.ContextFactory);
        object[] args = new object[] { connString};
        BaseContext<DbContext> instance = (BaseContext<DbContext>)Activator.CreateInstance(contextFactoryType, args);
        return instance;
    }
}

Базовый класс

public class BaseContext<TContext> : DbContext where TContext : DbContext
{
    static BaseContext()
    {
        Database.SetInitializer<TContext>(null);
    }

    protected BaseContext(string connectionString) : base(connectionString)
    {
    }...

Дочерний класс

public class ContextImplementationTest : BaseContext<DbContext>
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {...}

Обновление: довызовите конструктор в дочернем классе, у вас должен быть конструктор в этом классе.

Детский класс

public class ContextImplementationTest : BaseContext<DbContext>
{
   protected ContextImplementationTest(string connectionString) : base(connectionString)
   {
   }...

1 Ответ

0 голосов
/ 25 июня 2018

Activator.CreateInstance принимает параметр nonPublic только в случае вызова конструктора по умолчанию.

Вы можете использовать Type.GetConstructor вместо:

Type contextFactoryType = 
    Type.GetType("Media.DB.Context.Implementation." + Settings.ContextFactory);

ConstructorInfo ci = contextFactoryType .GetConstructor(
    BindingFlags.Instance | BindingFlags.NonPublic,
    binder: null, new Type[] { typeof(string) }, modifiers: null);

object[] args = new object[] { connString };

var instance = (BaseContext<DbContext> instance)ci.Invoke(args);
return instance;
...