为元组生成泛型类型

本文关键字:泛型类型 元组 | 更新日期: 2023-09-27 17:58:57

我已经清楚地确定了如何在预先知道项目数量的情况下制作一个通用Tuple,如下所示。。。

        Type t = typeof(Tuple<,,>);
        Type[] keys = new Type[] { typeof(string), typeof(string), typeof(int) };
        Type specific = t.MakeGenericType(keys);

但是如果"keys"数组中的对象数量是可变的呢?如何从最初分配给"t"开始滚动?

干杯。Craig

为元组生成泛型类型

就我个人而言,我会有一个泛型类型定义数组:

Type[] tupleTypes = {
    typeof(Tuple<>),
    typeof(Tuple<,>),
    typeof(Tuple<,,>),
    typeof(Tuple<,,,>),
    typeof(Tuple<,,,,>),
    typeof(Tuple<,,,,,>),
    typeof(Tuple<,,,,,,>),
    typeof(Tuple<,,,,,,,>),
};

可以在代码中这样做,但这会有点痛苦。。。可能类似于:

Type[] tupleTypes = Enumerable.Range(1, 8)
                              .Select(x => Type.GetType("System.Tuple`" + x)
                              .ToArray();

或者避开阵列:

Type generic = Type.GetType("System.Tuple`" + keys.Length);
Type specific = generic.MakeGenericType(keys);

通过Tuple构建tupleTypes的另一种方法。创建:

// once
Type[] tupleTypes = typeof(Tuple).GetMethods(BindingFlags.Public | BindingFlags.Static)
    .Where(mi => mi.IsGenericMethod && mi.Name == "Create")
    .Select(mi => mi.ReturnType.GetGenericTypeDefinition())
    .Distinct() // make sure there is no duplicated return types
    .OrderBy(t => t.GetGenericArguments().Length)
    .ToArray(); // expect start from Tuple<>
// instant type creation
Type tupleType = tupleTypes[types.Length-1].MakeGenericType(types);

当然,这需要类System。元组将包含只生成元组<…>的静态Create方法。