2014-10-21 5 views
0

Скажем, у меня есть функция, которая принимает анонимный тип. Если тип, который передается, фактически является списком. Затем, когда я пытаюсь получить поля внутри, он становится недействительным. Итак, теперь я проверяю, является ли это массивом, и если это массив, я сначала получу тип элемента перед получением полей. Но теперь я застрял, я все равно не могу индексировать каждый элемент внутри этого списка. Ниже приведен фрагмент функции. Какие-либо предложения?Как индексировать из 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; 
} 

ответ

0

Вы можете использовать два ArrayLists один для каждого аргумента, если тип списка, заполнить ArrayLists с элементами этого списка, и если тип не является списком, заселить 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; 
    } 
+0

Спасибо. Это прекрасно работает. вы чемпион. Но, к сожалению, им еще далеко от завершения задачи. Есть еще много неожиданных проблем. – CJC

Смежные вопросы