2011-11-29 70 views
0

我在寫一個包含任何類型變量的類。爲此,我存儲變量(作爲object參考)和它的Type。但是,當我嘗試將object轉換回正確的類型時,由於我將字段(類型爲Type)用作類型,所以出現錯誤CS0118。「Error CS0118:'field'used as'type'」with Type field

這裏是我的類:

public class Node 
{ 
    Type m_oType = null; 
    public Type Type 
    { 
     get { return m_oType; } 
     set { m_oType = value; } 
    } 

    object m_oValue = null; 
    public object Value 
    { 
     get { return m_oValue; } 
     set 
     { 
      if (m_oValue == null) 
      { 
       if (value is m_oType) // ERROR CS0118 
       { 
        m_oValue = value; 
       } 
      } 
     } 
    } 
} 

我試着換一種方式來做到這一點網上搜索(即使用轉換操作符,asis),但我不斷收到大約相同的基本教程鑄造變量。有人能給我一個關於我如何實現這一目標的指針嗎?謝謝。

+0

似乎有人沒有聽說過仿製藥。 – ChaosPandion

+0

混沌,我不能使用泛型,因爲我需要管理許多'Node'對象而不知道它們包含的變量類型(沒有任何保證它們都是相同的類型)。 – Simone

+0

抱歉放肆,只是我的大腦自動將該代碼翻譯爲泛型。 – ChaosPandion

回答

3

我懷疑你想是這樣的(但閱讀):

if (m_oType.IsAssignableFrom(value.GetType())) 

請注意,我們叫它m_oType,不及格m_oType它。從上IsAssignableFrom的返回值,該文檔,其中c是參數:

真,如果c和當前Type表示相同的類型,或者如果當前類型是在C的繼承層次結構,或者如果當前Type是c實現的接口,或者如果c是泛型類型參數,並且當前Type代表c的約束之一。

例如,typeof(object).IsAssignableFrom(typeof(string))返回true因爲object處於string繼承層次結構。

編輯:如上所述,如果m_oType爲空或value爲空,將會中斷。我們可以輕鬆地獲得valuenull,但不清楚如果m_oType爲空,您會期望它做什麼。也許你應該阻止在Type屬性(和構造函數)的setter?然後使用:

// This will always store a null 
if (value == null || m_oType.IsAssignableFrom(value.GetType())) 

// This will never store a null 
if (value != null && m_oType.IsAssignableFrom(value.GetType())) 
+1

該代碼兩次容易受到'NullReferenceException'的影響。 – ChaosPandion

+0

@ChaosPandion:是的。將解決。 –

+0

謝謝喬恩!這似乎解決了「我」需要的問題。混沌也非常精確地注意到'null'漏洞 - 當然你上面看到的是概念證明,實際代碼包括各種檢查:-) – Simone

2

喜歡的東西

if (m_oType.IsAssignableFrom(value.GetType())) 

但我敢肯定,你應該看看泛型。

public class Node<T> 
{ 
    T m_oValue = null; 
    public T Value 
    { 
     get { return m_oValue; } 
     set 
     { 
      if (m_oValue == null) 
      { 
       m_oValue = value; 
      } 
     } 
    } 
} 
+0

其他方法...... –

+0

@JonSkeet,你說得對,固定的。 –

+0

謝謝Albin,但這不是我所需要的。我需要製作'Node'列表,並在不知道'T'類型的情況下處理它們。據我所知(糾正我,如果我錯了),我不能收集'節點'連同'節點'。 – Simone