C# LINQ查询内部的属性反射的行为与预期不符

C# LINQ查询内部的属性反射的行为与预期不符,c#,linq,reflection,C#,Linq,Reflection,给定C中的以下代码行: var testvalue = result[0] .GetType() .GetProperty(propertyNameToFilterOn) .GetValue(result[0], null); var test = result .Where(x => x .GetType() .GetProperty(propertyNameToFilterOn) ?.GetValue(x, null) == "46e

给定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个对象。第一行确认集合中的第一个对象确实具有我在第二行中筛选的值,而第二行告诉我集合中没有对象在我正在检查的属性上具有该值。有人能解释为什么这不起作用吗?并可能提供另一种选择?

因为?.GetValuex,null返回对象的实例,当您将其与46ee6799-2bed-4a7a-93f8-0839affbd218进行比较时,您比较的是引用,而不是值:

结果:

使用string.Equals而不是==来比较值:


该属性的返回类型是什么?GetValue将返回一个对象,因此我猜您正在比较两个具有相同值但不是相同实例的字符串实例。属性是string还是Guid?如果是其中一个,Guid!=比较时使用字符串。如果我的上述理论正确,请尝试使用等于而不是==。这可能是一个错误。您实际想做什么?属性的返回类型未知。这是一个通用的T。但是当我测试时,我使用一个特定的类型进行测试。在本例中,属性是字符串guid,但理论上它可以是进入azure表实体的任何内容。如果回答问题的原始人在一段时间内没有发布答案,我将批准此操作。
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
var test = result
  .Where(x => string.Equals(x
      .GetType()
      .GetProperty(propertyNameToFilterOn)
     ?.GetValue(x, null), "46ee6799-2bed-4a7a-93f8-0839affbd218"))
  .ToList();