2012-05-14 66 views
0

比方說,我有一個類的公共屬性裏面,像這樣:使用類型T'的變量設置類型T的屬性,並在設置器中處理轉換?

class Data 
{ 
    public int Property { get; set; } 
} 

現在,出於某種原因,我想爲一個字符串傳遞給這個屬性。我可以在通過它之前將字符串轉換爲Int32,但懶惰更容易。是否有可能更改setter以便轉換自動完成?如在:

if (value is string) Property = Int32.Parse(value); 

當然,這個例子不起作用。 VS拋出一個錯誤,並加上一個關於值如何永遠不會是字符串的警告。

編輯:是的,我知道這是一個壞主意。這只是好奇心。

+1

不,那是不可能的。這也不是一個好主意。 – SLaks

+0

我從來沒有說過這是個好主意,而是純粹的好奇心。 – pikzen

+0

爲了確保我理解你的問題,你意識到'value'在setter中永遠不會是'int',但是你希望能夠將任何值傳遞給'Data.Property'並處理轉換事後,而不是先驗*?你的意思是使用'object'嗎? – user7116

回答

3

以這種方式改變setter是不可能的。 C#中屬性的setter必須與屬性本身具有相同的類型。作爲setter的函數,沒有辦法插入任何其他類型的靜態轉換。

+0

恩,謝謝。實際上,如果可能的話,它會讓我感到驚訝。 – pikzen

3

如果你想避免的轉換,您可以創建setter方法,而不是使用屬性setter:

void SetProperty(int value); 
void SetProperty(String value); 

等。

如果你真的想變得瘋狂,你可以創建一個PropertyValue類型,並使用int,字符串和任何你想要的類型進行隱式轉換,並將其用作屬性類型。它會讓制定者表現得像你想要的那樣,但是你會對吸氣者有問題。如果您確實想要保存這些轉換,請使用第一個解決方案。

0

你可以使用類型object的屬性:

class Data { 
    private int _property; 
    public object Property { 
    get { 
     return _property; 
    } 
    set { 
     if (value is string) { 
     _property = Int32.Parse(value); 
     } else { 
     _property = (int)value; 
     } 
    } 
    } 
} 

這不是很實用,雖然。當您將int分配給該房產時,它將被隱式地裝箱在object中,然後取消裝箱。當獲得該值時,獲取者將返回int,該值爲object,因此如果要將其作爲int值,則必須將其取消(投射)。

2

否,每語言規範如果聲明一個屬性作爲某種類型的T,然後value將被保證是T(或其派生類型的一個或一個實現接口T一型)在編譯時。

如果您希望您的二傳手收到任何類型的值,使用object

private int prop; 

public object Property 
{ 
    get { return this.prop; } 
    set 
    { 
     this.prop = value != null ? Int32.Parse(value.ToString()) : 0; 
    } 
}