Я хотел использовать статический конструктор в производных классах для регистрации лямбда-выражений конструктора объектов для тех классов, которые будут вызываться при передаче определенного объекта Type
.
Поскольку статический конструктор вызывается только непосредственно перед созданием первого объекта этого класса, НО я хочу использовать результат статического конструктора, чтобы определить, какой объект создавать, этот механизм не работает, лямбда-конструктор не найден.
Есть ли выход из этого?
public abstract class Cacheable
{
// ... details do not matter ...
}
public class Series: Cacheable
{
// ... details do not matter ...
}
public abstract class CacheableViewForm
{
static Dictionary<Type, Func<CacheableViewForm>> cacheableViewFormConstructors = new Dictionary<Type, Func<CacheableViewForm>>();
protected static void Register<CacheableViewFormClass, CacheableClass>()
where CacheableViewFormClass: CacheableViewForm, new()
where CacheableClass: Cacheable
{
cacheableViewFormConstructors[typeof(CacheableClass)] = (() => new CacheableViewFormClass());
}
public static CacheableViewForm CreateFromTargetType(Type cacheableType)
{
return cacheableViewFormConstructors[cacheableType]();
}
// ... details do not matter ...
}
public class SeriesViewForm: CacheableViewForm
{
static SeriesViewForm() {Register<SeriesViewForm, Series>();}
// ... details do not matter ...
}
// fails because CacheableViewForm.Register<> has not been executed yet!
CacheableViewForm newForm = CacheableViewForm.CreateFromTargetType(typeof(Series));