![](/img/trans.png)
[英]AutoFixture: how to CreateAnonymous from a 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.