以下是该方案:
创建一个具有多种泛型类型的实例,例如:
var obj = myBuilder
.Combine<TypeA>()
.And<TypeB>
.And<TypeC>
.Create();
我想要输入Create()返回的 obj
Combined<TypeA, TypeB, TypeC>
我知道我可以使用Combined<TypeA, TypeB, TypeC>
创建通用实例,但是如何在不同方法上组合并返回泛型类型?
我不想在客户端代码中从MakeGenericType
类型转换返回对象。我觉得这是多余和丑陋的:
Create()
这可能吗?
答案 0 :(得分:3)
Currying适用于以太类型的参数 - 类型或参数。
因此,您可以相对轻松地创建可以在C#中为特定类型执行所需操作的类。一种可能的方法是将类型捕获到中间类中,例如:
class Captured<T>
{
public Captured<T,U> And<U>() { return new Captured<T,U>();}
}
class Captured<T,U>
{
public Captured<T,U, V> And<V>() { return new Captured<T,U,V>();}
}
class Captured<T,U, V>
{
public Combined<T,U, V> Build() { return new Combined<T,U,V>();}
}
答案 1 :(得分:1)
虽然curry工作正常,但正如我的工作同事所指出的那样,所使用的代码会在流程中创建一个太多的实例。目的是真正获得Combined<T,U,V>
并且使用几个中间对象似乎很重要。静态类是一种替代方案,令我惊讶的是,带有泛型的嵌套静态类可以很好地工作,并且代码非常优雅。我很高兴我们甚至在C#中拥有嵌套类的功能。我正在为遇到类似问题的人发布示例代码。
public static class Combine<T>
{
public static class With<U>
{
public static class And<V>
{
public static CombinedType<T, U, V> Create
{
get
{
return new CombinedType<T, U, V>();
}
}
}
}
}
class CombinedType<T, U, V> { }
class TypeA { }
class TypeB { }
class TypeB { }
// client call
var type = Combine<TypeA>.With<TypeB>.And<TypeC>.Create;