为元组制作通用类型

时间:2011-06-13 14:36:09

标签: c# generics reflection tuples

我已经清楚地确定了如何在预先知道项目数量时如下制作通用元组...

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

但是如果“keys”数组中的对象数量是可变的呢?如何以初始分配到“t”开始滚动球?

干杯。 克雷格

2 个答案:

答案 0 :(得分:8)

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

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);

答案 1 :(得分:2)

通过Tuple.Create构建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.Tuple类将包含仅生成Tuple&lt; ...&gt;的静态Create方法。