我已经清楚地确定了如何在预先知道项目数量时如下制作通用元组...
Type t = typeof(Tuple<,,>);
Type[] keys = new Type[] { typeof(string), typeof(string), typeof(int) };
Type specific = t.MakeGenericType(keys);
但是如果“keys”数组中的对象数量是可变的呢?如何以初始分配到“t”开始滚动球?
干杯。 克雷格
答案 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方法。