C# &引用;反向;类型推断是否可能?

C# &引用;反向;类型推断是否可能?,c#,generics,type-inference,C#,Generics,Type Inference,给定以下类(使用工厂是因为C#不支持构造函数的类型推断): 公共A类 { 公共A(B){} } 公共B级 { 公共B(C){} } 公共C类 { 公共C(T)tee{} } D类公共服务 { 公共静态D创建(表达式属性) { 归还新的D(财产); } } D类:D类 { 公共D(表达式属性){} } 公共类模型 { 公共int P1{get;set;} 公共字符串P2{get;set;} } 公营工厂 { 公共静态A创建(B蜜蜂) { 返回新的(蜜蜂); } } 公营工厂 { 公共静态B创建(C

给定以下类(使用工厂是因为C#不支持构造函数的类型推断):

公共A类
{
公共A(B){}
}
公共B级
{
公共B(C){}
}
公共C类
{
公共C(T)tee{}
}
D类公共服务
{
公共静态D创建(表达式属性)
{
归还新的D(财产);
}
}
D类:D类
{
公共D(表达式属性){}
}
公共类模型
{
公共int P1{get;set;}
公共字符串P2{get;set;}
}
公营工厂
{
公共静态A创建(B蜜蜂)
{
返回新的(蜜蜂);
}
}
公营工厂
{
公共静态B创建(C cee)
{
返回新的B(cee);
}
}
公营工厂
{
公共静态C创建(参数D[]T)
{
返回null;
}
}
汇编如下:

AFactory.Create(BFactory.Create(CFactory.Create(
    D<Model>.Create(m => m.P1), D<Model>.Create(m => m.P2)
)));
AFactory.Create(BFactory.Create(CFactory.Create(
D.Create(m=>m.P1),D.Create(m=>m.P2)
)));
以下没有

AFactory.Create<Model>(BFactory.Create(CFactory.Create(
    D.Create(m => m.P1), D.Create(m => m.P2)
)));
AFactory.Create(BFactory.Create(CFactory.Create(
D.Create(m=>m.P1),D.Create(m=>m.P2)
)));
不同之处在于,在第一个示例中,我在最内层的类上指定了模型的类型,因此类型推断正常工作,并向树上传播。问题是,我必须在每个
D.Create()
调用中指定模型类型,这似乎是多余的

第二个例子是我喜欢的编写代码的方法:告诉最外层的类它的类型是
Model
,所有正在构造的类也都使用该类型。本质上,它是
AFactory.Create(BFactory.Create(/*turtles一直向下…*/)
的语法糖

有没有办法在C#中实现这一点?我已经尝试了我能想到的所有继承和类型约束的排列,但是没有任何东西给我想要的结果


我也完全意识到我可能遗漏了泛型的一些基本知识——如果是这样的话,请随时告诉我。

类型推断通常是从内到外进行的。此外,类的泛型参数通常不会像您预期的那样推断出来。您正在通过级联参数列表将越来越多的内容传递给
AFactory。创建
。使用这种方法,
D.Create
实际上是指定的第一件事,它的指定方式无法将有用的信息传递给
CFactory.Create
。如果将其转换为fluent(链接函数)解决方案,则只需指定一次类型,因为每个函数的返回值包含下一个函数的类型信息。类似于
AFactory.Define().Containing().BFactory().Containing().CFactory().With(m=>m.P1)和(m=>m.P2).Create()
。的可能重复项
AFactory.Create<Model>(BFactory.Create(CFactory.Create(
    D.Create(m => m.P1), D.Create(m => m.P2)
)));