При условии наличия следующих интерфейсов
public interface IRoot
{
IChildA ChildA { get; }
IChildB ChildB { get; }
}
public interface IChildA
{
IGrandChildA GrandChildA { get; }
IGrandChildB GrandChildB { get; }
}
public interface IChildB
{
IGrandChildC GrandChildC { get; }
}
public interface IGrandChildA
{
}
public interface IGrandChildB
{
}
public interface IGrandChildC
{
}
Я бы хотел написать «конфигуратор» в свободном стиле, чтобы сохранить ассоциации интерфейсов. Все должно выглядеть так:
private static void Test()
{
Configurator.Root<IRoot>()
.Join( _ => _.ChildA )
.Join( _ => _.GrandChildA )
.Up()
.Join( _ => _.GrandChildB )
.Up()
.Up()
.Join( _ => _.ChildB );
}
Требуется разрешить произвольный уровень вложенности пар 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(); // This is the problem. How can I get grand-parent type?
}
Мне неясно, как я мог запомнить все предыдущие типы узлов. Другими словами, как объявить метод Up()
? Это напоминает мне старые добрые списки типов Александреску в C ++. Есть ли способ добиться того же в .net?