如何找出给定对象是通用列表还是列表列表

本文关键字:列表 何找出 对象 | 更新日期: 2023-09-27 18:22:45

List<List<HeaderTypeEnq<dynamic>>> IDEnq = new List<List<HeaderTypeEnq<dynamic>>>();
List<HeaderTypeEnq<dynamic>> IDListEnq = new List<HeaderTypeEnq<dynamic>>();
for (int i = 0; i < enq.Id.Count; i++)
{
    IDListEnq.Add(new HeaderTypeEnq<dynamic>() { FieldTag = "ID", FieldName = "Segment Tag", Value = enq.Id[i].SegmentTag, Mandatory = "Y", CharacterType = "A", MaxLength = 03 });
    IDListEnq.Add(new HeaderTypeEnq<dynamic>() { FieldTag = "01", FieldName = "ID Type", Value = enq.Id[i].IDType, Mandatory = "Y", CharacterType = "N", MaxLength = 02 });
    IDListEnq.Add(new HeaderTypeEnq<dynamic>() { FieldTag = "02", FieldName = "ID Number", Value = enq.Id[i].IDNumber, Mandatory = "N", CharacterType = "P", MaxLength = 30 });
    IDEnq.Add(IDListEnq);
}
ValidateValue<List<HeaderTypeEnq<dynamic>>>(IDEnq, concaDel);

private string ValidateValue<T>(object EnqTagList, ValidationDelegate del)
{
    //errorstr = "";
    Type typeParameterType = typeof(T);
    if (typeof(T) == typeof(List<HeaderTypeEnq<dynamic>>))
    {
        //code
    }

根据我的理解if (typeof(T) == typeof(List<HeaderTypeEnq<dynamic>>))应该为IDEnq返回 false(列表列表(,但它返回 true!

如何找出给定对象是通用列表<T>还是列表列表<T>

为了检查类型t是否是列表列表,您可以执行以下操作:

if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<>))
{
    Type elementType = t.GetGenericArguments()[0];
    if (elementType.IsGenericType && elementType.GetGenericTypeDefinition() == typeof(List<>))
        Console.WriteLine("t is a list of lists");
    else
        Console.WriteLine("t is just a list");
}
else
    Console.WriteLine("t is not a list");

根据我的理解,如果 (typeof(T( == typeof(List>(( 应该为 IDEnq(列表列表(返回 false,但它返回 true!

您正在像这样调用泛型类型

 ValidateValue<List<HeaderTypeEnq<dynamic>>>(IDEnq, concaDel);

泛型类型是这个List<HeaderTypeEnq<dynamic>>。这与IDEnqobject以来无关。因此,当您像这样调用方法时,T 正是List<HeaderTypeEnq<dynamic>>的类型,条件变为 true。

你可以像这样制作你的泛型方法。现在 EnqTagList 是 T。您需要获取其元素的类型。

private string ValidateValue<T>(T EnqTagList, ValidationDelegate del) 
{
    if (EnqTagList.GetType().GetGenericArguments()[0] == typeof(List<HeaderTypeEnq<dynamic>>))
    {
     //code
    }
}