Отражение свойств внутри запроса LINQ не работает должным образом - PullRequest
0 голосов
/ 05 марта 2020

Учитывая следующие строки кода в C#:

var testvalue = result[0]
  .GetType()
  .GetProperty(propertyNameToFilterOn)
  .GetValue(result[0], null);

var test = result
  .Where(x => x
      .GetType()
      .GetProperty(propertyNameToFilterOn)
     ?.GetValue(x, null) == "46ee6799-2bed-4a7a-93f8-0839affbd218")
  .ToList();

результат, очевидно, содержит коллекцию объектов. Первая строка дает мне значение (46ee6799-2bed-4a7a-93f8-0839affbd218). Однако вторая строка возвращает 0 объектов в списке. Первая строка подтверждает, что первый объект в коллекции имеет значение, по которому я фильтрую, во второй строке, в то время как вторая строка говорит мне, что ни у одного объекта в коллекции нет этого значения для свойства, которое я проверяю. Может кто-нибудь объяснить, почему это не работает? И потенциально предоставить альтернативу?

1 Ответ

1 голос
/ 05 марта 2020

Поскольку ?.GetValue(x, null) возвращает экземпляр object, при сравнении с "46ee6799-2bed-4a7a-93f8-0839affbd218" вы сравниваете ссылки , а не значения :

string st = "46ee6799-2bed-4a7a-93f8-0839affbd218";

// Some manipulations (we don't want the compiler to intern strings)
object o = (st + " ").Trim();

Console.WriteLine(o == st ? "Equal" : "Not Equal");
Console.WriteLine(string.Equals(o, st) ? "Equal" : "Not Equal");

Результат:

Not Equal
Equal

Используйте string.Equals вместо ==, чтобы сравнить значения :

var test = result
  .Where(x => string.Equals(x
      .GetType()
      .GetProperty(propertyNameToFilterOn)
     ?.GetValue(x, null), "46ee6799-2bed-4a7a-93f8-0839affbd218"))
  .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...