2010-10-29 62 views
1

假设有以下接口在C#的泛型中键入列表:是否有可能?

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()方法?这让我想起了古老的好Alexandrescu的C++类型列表。有没有办法在.net中实现相同的功能?

回答

1

您至少需要两个接口;而不是为Up返回IConfigBuilder<...>,请相信创建代码以了解它创建的内容:

public interface IConfigBuilder<T> 
{ 
    IConfigBuilder<IConfigBuilder<T>, C> Join<C>(Expression<Func<T, C>> expression); 
} 
public interface IConfigBuilder<P, T> : IConfigBuilder<T> 
{ 
    P Up(); // This is the problem. How can I get grand-parent type? 
    new IConfigBuilder<IConfigBuilder<P, T>, C> Join<C>(Expression<Func<T, C>> expression); 
} 
相关问题