Richard Deeming
Если вы используете .NET 4.7.1 или более позднюю версию, вы можете проверить, реализует ли она Система.Время Выполнения.Услуги компиляторов.ITuple интерфейс[^]:
if (value is System.Runtime.CompilerServices.ITuple)
Это также позволит обнаружить новое
ValueTuple<>
типы.
В противном случае вам нужно будет получить определение универсального типа и сравнить его с восемью открытыми
Tuple<>
универсальные типы, поскольку они не имеют общего базового класса.
private static readonly HashSet<Type> TupleTypes = new HashSet<Type>
{
typeof(Tuple<>),
typeof(Tuple<,>),
typeof(Tuple<,,>),
typeof(Tuple<,,,>),
typeof(Tuple<,,,,>),
typeof(Tuple<,,,,,>),
typeof(Tuple<,,,,,,>),
typeof(Tuple<,,,,,,,>),
};
public static bool IsTuple(Type type) => type != null
&& type.IsGenericType
&& TupleTypes.Contains(type.GetGenericTypeDefinition());
public static bool IsTuple(object value) => value != null
&& IsTuple(value.GetType());
Вот этот
не будет включите в себя
ValueTuple<>
типы, если вы не добавите их в список.
BillWoodruff
Тест "foo is ValueType" кажется допустимым для любого экземпляра ValueTuple с любым количеством параметров. Конечно, я использую фреймворк более поздней версии.
Может ли существовать Кортеж< gt;: Я знаю, что не могу объявить его в VStudio, так же как я не могу объявить ValueTuple без хотя бы одного экземпляра юридического типа,
honey the codewitch
ну да, я думаю, что это тип значения в том смысле, что он происходит от ValueType, а не непосредственно от object, но это не совсем то, что я ищу, так как int также возвращает true там тоже.
вы не можете объявить частичные дженерики, но вы можете вызвать typeof на них так, как typeof(IList<>) работает, но класс foo : IList<> {} не работает
я думаю, что ValueTuple просто использует ref внутренне (это тип ref) или что-то в этом роде. я должен проверить
BillWoodruff
Тип ' ValueTuple-это представление типа значения кортежа."
Экземпляры этого типа являются изменяемыми и являются структурами. Если вы используете "именованные аргументы", то эти метаданные не сериализуемы.
Это новая структура, начиная с C#7, .NET FrameWork >= 4.
Я предлагаю вам изучить его определение и использование:
https://stackoverflow.com/a/41084470
https://blogs.msdn.microsoft.com/mazhou/2017/05/26/c-7-series-part-1-value-tuples/