如何从System.Type索引

时间:2014-10-21 02:10:42

标签: c# list type-conversion 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;
}

1 个答案:

答案 0 :(得分:0)

您可以为每个参数使用两个ArrayLists,如果类型为list,则使用该列表的元素填充ArrayLists,如果type不是列表,则使用单个项填充ArrayLists。然后遍历ArrayLists进行比较,(您可以根据需要修改比较方法,例如,一个列表可能包含的项目多于其他列表)

    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;
    }