给定以下类(因为C#不支持构造函数的类型推断而使用的工厂):
public class A<T>
{
public A(B<T> b) { }
}
public class B<T>
{
public B(C<T> c) { }
}
public class C<T>
{
public C(T tee) { }
}
public class D<T>
{
public static D<T> Create<V>(Expression<Func<T, V>> property)
{
return new D<T, V>(property);
}
}
public class D<T, V> : D<T>
{
public D(Expression<Func<T, V>> property) { }
}
public class Model
{
public int P1 { get; set; }
public string P2 { get; set; }
}
public class AFactory
{
public static A<T> Create<T>(B<T> bee)
{
return new A<T>(bee);
}
}
public class BFactory
{
public static B<T> Create<T>(C<T> cee)
{
return new B<T>(cee);
}
}
public class CFactory
{
public static C<T> Create<T>(params D<T>[] tees)
{
return null;
}
}
以下编译:
AFactory.Create(BFactory.Create(CFactory.Create(
D<Model>.Create(m => m.P1), D<Model>.Create(m => m.P2)
)));
以下不:
AFactory.Create<Model>(BFactory.Create(CFactory.Create(
D.Create(m => m.P1), D.Create(m => m.P2)
)));
不同之处在于,在第一个示例中,我指定了最内层类的模型类型,因此类型推断正常工作并向上传播。问题是我必须在每次 D.Create()
调用上指定模型类型,这似乎是多余的。
第二个例子是我喜欢编写这段代码的方式:告诉最外层的类,它的类型是Model
,并且所有正在构造的类都使用该类型好。从本质上讲,它是AFactory.Create<Model>(BFactory.Create<Model>(/* turtles all the way down... */))
的语法糖。
有没有办法在C#中实现这一目标?我已经尝试了所有可以想到的继承和类型约束的排列,但没有任何东西给我预期的结果。
我也完全清楚我可能会遗漏一些关于泛型的基本信息 - 如果是这种情况,请随时教我。