假设我有一个采用匿名类型的函数。如果传入的类型实际上是一个列表。然后,当我尝试获取其中的字段时,它变得无效。所以现在我检查它是否是一个数组,如果它是一个数组,我将在获取字段之前先获取元素类型。但现在我卡住了,无论如何我无法找到这个列表中的每个元素的索引。以下是该功能的摘录。有什么建议吗?
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;
}
答案 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;
}