2010-10-07 82 views
2

我正在使用以下代碼來比較類型,以便DataContractSerializer將在必要時使用正確類型重新初始化。類型比較不返回預期結果

private void InitializeSerializer(Type type) 
    { 
     if (this.serializer == null) 
     { 
      this.serializer = new DataContractSerializer(type); 
      this.typeToSerialize = type; 
     } 
     else 
     { 
      if (this.typeToSerialize != null) 
      { 
       if (this.typeToSerialize.GetType() != type.GetType()) 
       { 
        this.serializer = new DataContractSerializer(type); 
        this.typeToSerialize = type; 
       } 
      } 
     } 
    } 

出於某種原因,當我比較兩種結果始終是真的,我從來沒有進入最後的「如果」聲明,並重新初始化我的串行器。

我可以在比較設置一個破發點,並清楚地看到,兩種類型 List<Host>(this.typeToSerialize.GetType())和 Post(type.GetType())

主機和郵政共享一個共同的祖先,但這不應該影響結果。

+0

如果您正在使用Visual Studio,您是否曾嘗試在調試器中在此行上粘貼斷點,並且程序在此處中斷時在立即窗口中運行這兩種方法以查看產生了哪些輸出?使用.equals()嘗試 – 2010-10-07 13:44:59

+0

? – vulkanino 2010-10-07 13:47:55

回答

7

您正在致電GetType()System.Type。這將返回描述System.Type本身的System.Type對象。

這使得代碼

if (this.typeToSerialize.GetType() != type.GetType()) 
{ 
    ... 
} 

等同於:

if(typeof(System.Type) != typeof(System.Type)) // Always false 
{ 
    ... // Never enters here 
} 

我猜你真正的意思做的是:

if(typeToSerialize != type) 
{ 
    ... 
} 
+0

事實上,如果在條件下失去兩個.GetType()調用,它應該可以正常工作。 – 2010-10-07 13:43:58

+0

輝煌。我知道這很簡單。謝謝你的基本解釋。 – 2010-10-07 14:09:01

3
if (this.typeToSerialize != type) 

看起來更適當的

3

看起來好像您在比較兩個Type對象的類型。我認爲你需要比較類型對象本身。

this.typeToSerialize != type 

兩者this.typeToSerialize.GetType()和type.GetType()將返回的typeof(類型)(相同的對象)。