Сравните значения двух структур в C#

Вы также можете использовать ярлык эха вместо того, чтобы печатать «эхо бла»; как показано ниже:

<form method="POST" action="<?=(

Вы также можете использовать ярлык эха вместо того, чтобы печатать «эхо бла»; как показано ниже:

[110]SERVER['PHP_SELF'])?>">
5
задан Noctis 28 July 2014 в 13:53
поделиться

4 ответа

Это можно сделать с помощью Reflection. Проверьте примеры FieldInfo и PropertyInfo .

Пример MSDN (немного изменен):

    Type myType = typeof(TestStruct);

    // Get the fields of TestStruct.
    FieldInfo[] myFieldInfo = 
        myType.GetFields(
           BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);

    Console.WriteLine("\nThe fields of TestStruct are \n");

    // Display the field information of TestStruct.
    for(int i = 0; i < myFieldInfo.Length; i++)
    {
        Console.WriteLine("\nName            : {0}", myFieldInfo[i].Name);
        Console.WriteLine("Declaring Type  : {0}", myFieldInfo[i].DeclaringType);
        Console.WriteLine("IsPublic        : {0}", myFieldInfo[i].IsPublic);
        Console.WriteLine("MemberType      : {0}", myFieldInfo[i].MemberType);
        Console.WriteLine("FieldType       : {0}", myFieldInfo[i].FieldType);
        Console.WriteLine("IsFamily        : {0}", myFieldInfo[i].IsFamily);
    }
10
ответ дан 13 December 2019 в 19:33
поделиться

Я пока не могу добавлять комментарии, поэтому в ответ на SwDevMan81 немного вверху ^

Если вам нужно значение и у вас есть FieldInfo .. .

object val = myFieldInfo[i].GetValue(Obj);

Кроме того,

GetFields () возвращает переменные-члены. Флаги определяют, нужны ли вам общедоступные / частные / статические члены и т. Д.

GetProperties () возвращает свойства.

1
ответ дан 13 December 2019 в 19:33
поделиться

Хорошо, поэтому, используя информацию о сообщениях людей, у нас будет новый метод сравнения, который выглядит следующим образом:

public List Compare2(TestStruct inTestStruct)
{
  List diffs = new List();

  FieldInfo[] fields = this.GetType().GetFields();
  FieldInfo[] fields2 = inTestStruct.GetType().GetFields();

  for (int i = 0; i < fields.Length; i++)
  {
     object value1 = fields[i].GetValue(this);
     object value2 = fields2[i].GetValue(inTestStruct);
     if (!value1.Equals(value2))
     {
        diffs.Add(new Diff(fields[i].Name, value1, value2));
     }
  }
  return diffs;
}

Похоже, это значительно уменьшает размер функции сравнения, но я все же иметь весь класс Diffs и дополнительный код. Есть ли еще способ попроще?

0
ответ дан 13 December 2019 в 19:33
поделиться

Linq ?

  public List<string> Compare(TestStruct x, TestStruct y) {  
    return (  
      from l1 in x.GetType().GetFields()  
      join l2 in y.GetType().GetFields() on l1.Name equals l2.Name  
      where !l1.GetValue(x).Equals(l2.GetValue(y))  
      select string.Format("{0} {1} {2}", l1.Name, l1.GetValue(x), l2.GetValue(y))  
    ).ToList();  
  }  
0
ответ дан 13 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: