gpt4 book ai didi

c# - 为什么 ExpandoObject 在 Guid 转换为字符串后无法正常工作?

转载 作者:行者123 更新时间:2023-11-30 14:50:16 24 4
gpt4 key购买 nike

如果您传递两个字符串,我有一段代码可以正常工作。出于某种原因,如果您将 GUID 转换为字符串,它的工作方式就不一样了。

更详细地说,如果我创建一个新的 ExpandoObject 并传递字符串值,它会起作用,但如果我传递转换为字符串的 GUID,它就不会起作用。

下面的代码应该比较两个参数。在我的示例中,我传递了相同的两个字符串。如果字符串相同,则使用 E​​qual 运算符应返回 true。如果第二个参数 GUID 转换为字符串,则返回 false,即使字符串相同。 dynamicObj.Add(memberName, Guid.Parse(value).ToString());

不确定我错过了什么。这是我的代码。

 string value = "642188c7-8e10-e111-961b-0ee1388ccc3b";

string memberName = "State";
string contactValue = value;

var dynamicObj = (IDictionary<string, object>)new ExpandoObject(); dynamicObj.Add(memberName, Guid.Parse(value).ToString());

var expression = Expression.Parameter(typeof(object), "arg");
var binder = Binder.GetMember(CSharpBinderFlags.None, memberName, null, new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) });

var property = Expression.Dynamic(binder, typeof(object), expression);

var isValid = false;
var right = Expression.Constant(contactValue);
var result = Expression.MakeBinary(ExpressionType.Equal, property, right);
var func = typeof(Func<,>).MakeGenericType(dynamicObj.GetType(), typeof(bool));
var expr = Expression.Lambda(func, result, expression).Compile();

isValid = (bool)expr.DynamicInvoke(dynamicObj);

最佳答案

GUID 解析将以与仅使用字符串文字相同的字符串(值)结束。

不同之处在于它在字典中的存储方式:它的类型为 Dictionary<string, object> .这意味着 Object对其进行分类 ==将使用运算符进行引用相等性检查。 String然而,类通过进行值相等性检查来重载它。

这就是返回 true 的原因:

Console.WriteLine(value == Guid.Parse(value).ToString());

虽然返回 false:

Console.WriteLine((object) value == (object) Guid.Parse(value).ToString());

由于字符串是不可变的,Guid.Parse(value).ToString()将创建一个新的 string对象并与 contactValue 进行引用相等性检查(与 value 相同)。这显然会返回 false与使用 value 相比一直返回true因为您永远不会创建新对象。

为了使其工作,您可以将动态操作数转换为 string。所以它将使用正确的重载:

var castDyn = Expression.Convert(property, typeof(string));
var result = Expression.MakeBinary(ExpressionType.Equal, castDyn, right);

关于c# - 为什么 ExpandoObject 在 Guid 转换为字符串后无法正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37123569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com