Я делаю 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]] 'не найден.'
Я несколько раз ударился головой о стену время сейчас. Как это можно сделать?