2010-05-20 10 views
2

我在making a generic property閱讀問題的類型,但我從first answer最後一個例子有點困惑(以下附上相關的代碼):通用屬性 - 如何在運行時指定

你必須知道在編譯 時間的類型。如果你不知道 編譯時的類型,那麼你一定是存儲 它在一個對象,在這種情況下,你可以 以下屬性添加到富 類:

public object ConvertedValue { 
    get { 
     return Convert.ChangeType(Value, Type); 
    } 
} 

這似乎奇怪的是:它將值轉換爲指定的類型,但是當值作爲對象存儲時,它會將其作爲對象返回。返回的對象是否仍然需要取消裝箱?如果是這樣,那麼爲什麼還要考慮類型的轉換?

我也想做出一個通用的屬性,其類型將在運行時間確定:

public class Foo 
{ 
    object Value {get;set;} 
    Type ValType{get;set;} 
    Foo(object value, Type type) 
    { Value = value; ValType = type; } 

    // I need a property that is actually 
    // returned as the specified value type... 
    public object ConvertedValue { 
     get { 
      return Convert.ChangeType(Value, ValType); 
     } 
    } 
} 

是否有可能使一個普通的財產?返回屬性仍然需要在訪問後拆箱?

注意:我不希望Foo通用,因爲我想Foo包含不同類型的值,並且我想將各種Foo組合到一個集合中。換句話說,我想擁有一個擁有不同類型對象的集合。

回答

2

Convert.ChangeType()決定運行時的類型。你給出的參數可以在運行時計算出來,並且可以是編譯器在編譯時不知道的東西。

這就是爲什麼它必須返回一個通用對象而不是特定類型。

它仍然轉換類型 - 例如從int到double。編譯時間類型爲object,但運行時類型更改。如果您在該對象上運行GetType(),則將獲得實際運行時類型。

當你將一個值類型轉換爲引用類型時,你可以獲得裝箱權,而另一種方式則可以取消裝箱 - 這取決於你使用的類型。

+0

好的,但我仍然必須將從ConvertedValue屬性返回的對象轉換爲運行時類型...是否可以直接以類似於泛型的方式在運行時類型中返回對象? – Kiril 2010-05-20 09:08:32

+0

@Lirik,你必須投它,所以編譯時間將是你想要的類型。運行時類型由ChangeType()方法「cast」(實際轉換)。在這裏使用泛型的問題是,你不能限制你的泛型類型爲int/short/byte/double ...你必須使用更一般的限制(使用where關鍵字),這不允許你做什麼你要。我的建議是使用重載或C#4.0動態。 – brickner 2010-05-20 09:20:17

+0

我正在使用3.5,並且我無法獲得C#4.0 ...重載不適合,因爲我正在傳遞Func委託。 Func委託對我來說有太多可能的聲明來實際編寫重載(並且未來可能會有更多)。我想我必須在Foo類的「客戶端」一側進行投射。 – Kiril 2010-05-20 09:27:16

相關問題