显然ITuple
是内部的,禁用typeof(ITuple).IsAssignableFrom(type)
等解决方案。另外,确定Tuple<>
到Tuple<,,,,,,,>
之前最有效的方法是什么?没有类型名称比较的解决方案是可取的。
答案 0 :(得分:12)
试试这个:
public static bool IsTupleType(Type type, bool checkBaseTypes = false)
{
if (type == null)
throw new ArgumentNullException(nameof(type));
if (type == typeof(Tuple))
return true;
while (type != null)
{
if (type.IsGenericType)
{
var genType = type.GetGenericTypeDefinition();
if (genType == typeof(Tuple<>)
|| genType == typeof(Tuple<,>)
|| genType == typeof(Tuple<,,>)
|| genType == typeof(Tuple<,,,>)
|| genType == typeof(Tuple<,,,,>)
|| genType == typeof(Tuple<,,,,,>)
|| genType == typeof(Tuple<,,,,,,>)
|| genType == typeof(Tuple<,,,,,,,>)
|| genType == typeof(Tuple<,,,,,,,>))
return true;
}
if (!checkBaseTypes)
break;
type = type.BaseType;
}
return false;
}
答案 1 :(得分:-1)
我知道OP不喜欢类型名称比较,但作为参考,我包括这个确定类型是否为值元组的简短解决方案:
var x = (1, 2, 3);
var xType = x.GetType();
var tType = typeof(ValueTuple);
var isTuple = xType.FullName.StartsWith(tType.FullName)
您可以添加xType.Assembly == tType.Assembly
以确定。