簡體   English   中英

如何從System.Type進行索引

[英]How to index from a System.Type

假設我有一個采用匿名類型的函數。 如果傳入的類型實際上是一個列表。 然后,當我嘗試獲取其中的字段時,該字段將無效。 因此,現在我檢查它是否為數組,以及是否為數組,在獲取字段之前,將首先獲取元素類型。 但是現在我陷入了困境,無論如何我都找不到索引此列表中的每個元素的索引。 下面是該功能的摘錄。 有什么建議么?

public static List<Variance> DetailedCompare<T>(T val1, T val2)
{
    List<Variance> variances = new List<Variance>();
    FieldInfo[] fi;

    if(!val1.GetType().IsArray)
        fi= val1.GetType().GetFields(BindingFlags.Instance |
                                      BindingFlags.Static |
                                      BindingFlags.NonPublic |
                                      BindingFlags.Public);
    else
        fi = val1.GetType().GetElementType().GetFields();

    foreach (FieldInfo f in fi)
    {
        Variance v = new Variance();
        v.Prop = f.Name;
        v.valA = f.GetValue(val1);
        v.valB = f.GetValue(val2);
        if (!v.valA.Equals(v.valB))
        {
            DetailedCompare(v.valA, v.valB);
            variances.Add(v);
        }
    }
    return variances;
}

您可以對每個參數使用兩個ArrayList,如果類型是列表,則用該列表的元素填充ArrayList,如果類型不是列表,則用單個項填充ArrayList。 然后遍歷ArrayList進行比較(您可以根據需要修改比較方法,例如,一個列表可能比其他列表具有更多項)

    public static List<Variance> DetailedCompare<T>(T val1, T val2)
    {
        List<Variance> variances = new List<Variance>();
        FieldInfo[] fi;
        ArrayList list1 = new ArrayList();
        ArrayList list2 = new ArrayList();
        if (!val1.GetType().IsArray)
        {
            fi = val1.GetType().GetFields(BindingFlags.Instance |
                                          BindingFlags.Static |
                                          BindingFlags.NonPublic |
                                          BindingFlags.Public);
            list1.Add(val1);
            list2.Add(val2);
        }
        else
        {
            fi = val1.GetType().GetElementType().GetFields();
            list1.AddRange(val1 as ICollection);
            list2.AddRange(val2 as ICollection);
        }

        IEnumerator en1 = list1.GetEnumerator();
        IEnumerator en2 = list2.GetEnumerator();
        while (en1.MoveNext() && en2.MoveNext())
        {
            foreach (FieldInfo f in fi)
            {
                Variance v = new Variance();
                v.Prop = f.Name;
                v.valA = f.GetValue(en1.Current);
                v.valB = f.GetValue(en2.Current);
                if (!v.valA.Equals(v.valB))
                {
                    DetailedCompare(v.valA, v.valB);
                    variances.Add(v);
                }
            }
        }

        return variances;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM