CreateInstance и Lazy экземпляр с параметрами - PullRequest
0 голосов
/ 16 апреля 2020

Я делаю API для сторонней базы данных. Теперь я застрял в попытке сделать код, который создает экземпляры для отложенной загрузки. Это работает, если я использую его без констурктора с параметрами, но я не нахожу способ отправить параметры.

У меня есть класс БД:

    class BaseDBObject
    {
        public BaseDBObject()
        {
            Console.WriteLine("NO PARAM CONSTRUCTOR");

        }
        public BaseDBObject(string primaryKey)
        {
            LoadFromDB(primaryKey);
        }
        public string LoadedFromDB = null;
        public void LoadFromDB(string primaryKey)
        {
            Console.WriteLine("CONSTRUCTOR FOR  "+primaryKey);
            //...code cutted off...
            LoadedFromDB = DateTime.Now.ToLongTimeString();
        }
    }
    class ChildDBObject:BaseDBObject
    {
        public ChildDBObject():base(){}
        public ChildDBObject(string primaryKey) : base(primaryKey){}
    }

, а затем у меня есть класс "Content" :

    class DatabaseContext
    {
        public ChildDBObject ObjectFromDB
        {
            get
            {
                return _ObjectFromDB.Value;
            }
        }

        private Lazy<ChildDBObject> _ObjectFromDB = new Lazy<ChildDBObject>();

        public DatabaseContext()
        {
            //This is part of serialization, I can't call ObjectFromDB directly
            var ObjectField = this.GetType().GetField("_ObjectFromDB", BindingFlags.NonPublic | BindingFlags.Instance );
            var rowTemplate = Activator.CreateInstance(ObjectField.FieldType,  "PrimaryKeyValue");
            ObjectField.SetValue(this, rowTemplate);
        }
    }

Если я использую только Activator.CreateInstance (ObjectField.FieldType), он работает идеально, и Lazy будет вызывать конструктор при первом использовании. Но когда я добавляю строковое значение для параметра (чтобы я мог использовать внешний API для загрузки данных), это выдает мне исключение:

System.MissingMethodException: 'Конструктор типа' System.Lazy`1 [[ConsoleApp3.Program + ChildDBObject, ConsoleApp3, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]] 'не найден.'

Я несколько раз ударился головой о стену время сейчас. Как это можно сделать?

...