“反向”类型推断可能吗?

时间:2015-07-13 10:46:56

标签: c# generics type-inference

给定以下类(因为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#中实现这一目标?我已经尝试了所有可以想到的继承和类型约束的排列,但没有任何东西给我预期的结果。

我也完全清楚我可能会遗漏一些关于泛型的基本信息 - 如果是这种情况,请随时教我。

0 个答案:

没有答案