C# - 从一元类型的方法(或类)创建并返回多类型泛型

时间:2014-08-09 00:17:25

标签: c# generics dynamic

以下是该方案:

创建一个具有多种泛型类型的实例,例如:

var obj = myBuilder
            .Combine<TypeA>()
            .And<TypeB>
            .And<TypeC>
            .Create();

我想要输入Create()返回的 obj Combined<TypeA, TypeB, TypeC>

我知道我可以使用Combined<TypeA, TypeB, TypeC>创建通用实例,但是如何在不同方法上组合并返回泛型类型?

我不想在客户端代码中从MakeGenericType类型转换返回对象。我觉得这是多余和丑陋的:

Create()

这可能吗?

2 个答案:

答案 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;