2010-10-29 57 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); 
} 
相關問題