如何在ValueTuple中动态迭代/检测具有null成员的成员类型?

时间:2018-01-04 01:24:08

标签: c# reflection tuples c#-7.0 valuetuple

我试图利用ValueTuple在通用方法的参数列表中简明地输入N类型的列表,然后再迭代该类型列表。

但是,我在迭代类型时遇到了问题,因为最初的Tuplenull个成员,所以调用.GetType()会给我一个NullReferenceException。

我意识到我可以通过实际的Type对象列表来做我需要的东西,但是我更喜欢在创建元组时允许的非常简洁的语法...当然因为这样的东西是如此阴谋我:)

public static void IterateTupleMemberTypes<T>() where T : ITuple, new()
{
   var tuple = new T();
   for (var i = 0; i < tuple.Length; ++i)
   {
      //First call to GetType() succeeds, first element is an int.
      //Second call to GetType() fails (null ref ex), second element is a string.
      Console.WriteLine($"Item{i} Type: {tuple[i].GetType()}");
   }
}

用法

public class CustomClass
{
   public int ID { get; set; }
}

IterateTupleMemberTypes<(int, string, CustomClass)>();

1 个答案:

答案 0 :(得分:0)

我认为你正在混合数据和元数据。 第一次调用成功,因为int是一个值类型,而default(int)将值赋给0,所以它可以工作。这不适用于引用类型,因为它们最初被赋值为null。

我认为这里的正确方法是反射 - 并且迭代类型的属性,而不需要创建实例(因此new()限制是多余的。)

public static void IterateTupleMemberTypes<T>() where T : ITuple
{
    var tupleGenericArguments = typeof(T).GetGenericArguments();
    for (var i = 0; i < tupleGenericArguments.Length; ++i)
    {
        Console.WriteLine($"Item{i} Type: {tupleGenericArguments[i].Name}");
    }
}