Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#和#x27中键入列表;s泛型:可能吗?_C#_Generics_C# 3.0 - Fatal编程技术网

在C#和#x27中键入列表;s泛型:可能吗?

在C#和#x27中键入列表;s泛型:可能吗?,c#,generics,c#-3.0,C#,Generics,C# 3.0,假设有以下接口 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 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 );
}
private静态无效测试()
{
Configurator.Root()
.Join(=>.ChildA)
.Join(=>a)
.Up()
.Join(=>\uB)
.Up()
.Up()
.Join(=>u.ChildB);
}
需要允许任意嵌套级别的连接/向上对。下面是我声明这种配置程序的尝试

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?
}
公共静态类配置器
{
公共静态IConfigBuilder根目录()
{
返回null;
}
}
公共接口IConfigBuilder
{
IConfigBuilder连接(表达式);

IConfigBuilder您至少需要两个接口;并且,不要为
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);
}
公共接口IConfigBuilder
{
IConfigBuilder连接(表达式);
}
公共接口IConfigBuilder:IConfigBuilder
{
P Up();//这就是问题所在。如何获取父级类型?
新的IConfigBuilder联接(表达式);
}