如何在具有空成员的 ValueTuple 中动态 iterate/detect 成员类型?
How to dynamically iterate/detect member types in ValueTuple that has null members?
我试图利用 ValueTuple
在泛型方法的参数列表中简洁地输入 N
类型列表,然后迭代该类型列表。
但是,我 运行 在迭代类型时遇到了问题,因为初始 Tuple
有 null
个成员,所以调用 .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)>();
我认为您在混合数据和元数据。
第一次调用成功,因为 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}");
}
}
我试图利用 ValueTuple
在泛型方法的参数列表中简洁地输入 N
类型列表,然后迭代该类型列表。
但是,我 运行 在迭代类型时遇到了问题,因为初始 Tuple
有 null
个成员,所以调用 .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)>();
我认为您在混合数据和元数据。 第一次调用成功,因为 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}");
}
}