Как проверить, является ли список ValueTuple типом List <ValueTuple>в C # 7 - PullRequest
1 голос
/ 23 октября 2019

Как я могу проверить, является ли список ValueTuple типом List<ValueTuple>, без учета типа параметров.

Это может быть:

new List<(150, "test")>()
new List<("testy", "test", 148)>()
new List<(true, "blablabla")>()

Что я пробовал

 public static bool IsTupleType2(this object tuple)
 {
     return tuple is ITuple;
 }

Этот метод расширения работает с объектом ValueTuple

Итак, я попытался с List<ITuple>, но он не работает

 public static bool IsTupleType2(this object tuple)
 {
     return tuple is List<ITuple>;
 }

Есть идеи?

Большое спасибо.

1 Ответ

4 голосов
/ 23 октября 2019

Это довольно простой (хотя и немного затянувшийся) способ сделать это:

private static readonly Type[] tupleTypes = new[]
{
    typeof(ValueTuple<>), typeof(ValueTuple<,>), typeof(ValueTuple<,,>),
    typeof(ValueTuple<,,,>), typeof(ValueTuple<,,,,>), typeof(ValueTuple<,,,,,>),
    typeof(ValueTuple<,,,,,,>), typeof(ValueTuple<,,,,,,,>)
};

public static bool IsListOfValueTuple(Type type)
{
    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
    {
        var arg = type.GetGenericArguments()[0];
        return arg.IsGenericType && tupleTypes.Contains(arg.GetGenericTypeDefinition());
    }
    return false;
}

public static void Main()
{
    Console.WriteLine(IsListOfValueTuple(typeof(List<(string, int)>)));
}
...