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# -从一元类型方法(或类)中创建并返回多类型泛型

柯里化适用于任何类型的实参-类型或形参。

所以你可以相对容易地创建类来做你想在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;