簡體   English   中英

為什么在Guid轉換為字符串時,ExpandoObject無法正常工作?

[英]Why ExpandoObject doesn't work properly with Guid converted to string?

如果傳遞兩個字符串,我有一段代碼可以正常工作。 由於某種原因,如果將GUID轉換為字符串,它將無法正常工作。

更詳細的說,如果我創建一個新的ExpandoObject並傳遞字符串值,它可以工作,但如果我將GUID轉換為字符串,則不會。

下面的代碼應該比較兩個參數。 在我的例子中,我傳遞了相同的兩個字符串。 使用Equal運算符,如果字符串相同,則應返回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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM