Требуется, чтобы вложенность пар Join/Up была произвольной. Сам конфигуратор вот
public static class Configurator
{
public static IConfigBuilder<T, T> Root<T>()
{
return null;
}
}
public interface IConfigBuilder<P, T>
{
IConfigBuilder<T, C> Join<C>( Expression<Func<T, C>> expression );
IConfigBuilder<???, P> Up(); // Откуда взять тип пред- предыдущего узла?
}
Непонятно как запоминать в IConfigBuilder'е типы всех ранее использованных узлов. То есть как объявлять метод Up()? Тут вспоминаются списки типов по Александреску. Мржет можно что-то подобное сделать в дотнете?
Здравствуйте, SergASh, Вы писали:
SAS>Привет всем!
SAS>Непонятно как запоминать в IConfigBuilder'е типы всех ранее использованных узлов. То есть как объявлять метод Up()? Тут вспоминаются списки типов по Александреску. Мржет можно что-то подобное сделать в дотнете?
так подойдет?
public interface IConfigBuilder<P, T>
{
IConfigBuilder<IConfigBuilder<P, T>, C> Join<C>( Expression<Func<T, C>> expression );
P Up();
}
public interface IConfigBuilder<T> : IConfigBuilder<IConfigBuilder<T>, T>
{
}
IConfigBuilder<T> используется как самый "верхний" конфигуратор:
public static class Configurator
{
public static IConfigBuilder<IConfigBuilder<T>, T> Root<T>()
{
return new RootConfigBuilder<T>();
}
}
class RootConfigBuilder<T> : ConfigBuilder<IConfigBuilder<T>, T>, IConfigBuilder<T>
{
public RootConfigBuilder()
: base(() => this)
{
}
}
class ConfigBuilder<P, T> : IConfigBuilder<P, T>
{
private Func<P> parent;
public ConfigBuilder(Func<P> parent)
{
this.parent = parent;
}
public IConfigBuilder<IConfigBuilder<P, T>, C> Join<C>(Expression<Func<T, C>> expression)
{
return new ConfigBuilder<IConfigBuilder<P, T>, C>(() => this);
}
public P Up()
{
return this.parent();
}
}
Здравствуйте, SergASh, Вы писали:
SAS>Кстати, не советйуте, пожалуйста, никому писать base( () => this ). Это естественно не работает, при вызове делегат вернет null.
Если быть точнее, то до вызова не дойдет.
error CS0027: Keyword 'this' is not available in the current context
Здравствуйте, SergASh, Вы писали:
SAS>Здравствуйте, k.o., Вы писали:
SAS>Кстати, не советйуте, пожалуйста, никому писать base( () => this ). Это естественно не работает, при вызове делегат вернет null.
Да, это был просто способ побыстрее получить что-то компилирующееся и даже почти работающее
SAS>СПАСИБО!
Здравствуйте, SergASh, Вы писали:
SAS>Здравствуйте, hardcase, Вы писали:
H>>Нельзя передавать куда либо лямбды с захваченным this до вызова конструктора базового типа.
SAS>Неправильно. Передавать можно и компилятор не возражает, просто это не приводит к ожидаемому результату. SAS>
Здравствуйте, SergASh, Вы писали:
SAS>Какая версия компилятора? На this в лямбде C# 3 не ругается.
Это был баг в C# 3.0 (такой код не должен компилироваться по спецификации, и он порождал неверифицируемый IL). В C# 4.0 его исправили, теперь это не компилируется.