c# -从一元类型方法(或类)中创建并返回多类型泛型
本文关键字:创建 返回 泛型 多类型 或类 类型 一元 方法 | 更新日期: 2023-09-27 18:17:17
场景如下:
创建具有多个泛型类型的实例,如:
var obj = myBuilder
.Combine<TypeA>()
.And<TypeB>
.And<TypeC>
.Create();
我希望Create()返回的obj被键入
Combined<TypeA, TypeB, TypeC>
我知道我可以用MakeGenericType
创建泛型实例,但如何组合并返回不同方法上的泛型类型?
我不想在客户端代码中从Create()
类型转换返回对象。我觉得这是多余的和丑陋的:
var obj = (Combined<TypeA, TypeB, TypeC>) myBuilder
.Combine<TypeA>()
.And<TypeB>
.And<TypeC>
.Create();
这可能吗?
柯里化适用于任何类型的实参-类型或形参。
所以你可以相对容易地创建类来做你想在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>();}
}
虽然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;