如何确定元组类型?
How to determine tuple types?
显然 ITuple
是内部的,禁用了 typeof(ITuple).IsAssignableFrom(type)
等解决方案。或者,确定 Tuple<>
到 Tuple<,,,,,,,>
的最有效方法是什么?没有类型名称比较的解决方案是更可取的。
试试这个:
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;
}
我知道 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
确定。
显然 ITuple
是内部的,禁用了 typeof(ITuple).IsAssignableFrom(type)
等解决方案。或者,确定 Tuple<>
到 Tuple<,,,,,,,>
的最有效方法是什么?没有类型名称比较的解决方案是更可取的。
试试这个:
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;
}
我知道 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
确定。