C# LINQ查询内部的属性反射的行为与预期不符
给定C中的以下代码行: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
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();