我在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
組合到一個集合中。換句話說,我想擁有一個擁有不同類型對象的集合。
好的,但我仍然必須將從ConvertedValue屬性返回的對象轉換爲運行時類型...是否可以直接以類似於泛型的方式在運行時類型中返回對象? – Kiril 2010-05-20 09:08:32
@Lirik,你必須投它,所以編譯時間將是你想要的類型。運行時類型由ChangeType()方法「cast」(實際轉換)。在這裏使用泛型的問題是,你不能限制你的泛型類型爲int/short/byte/double ...你必須使用更一般的限制(使用where關鍵字),這不允許你做什麼你要。我的建議是使用重載或C#4.0動態。 – brickner 2010-05-20 09:20:17
我正在使用3.5,並且我無法獲得C#4.0 ...重載不適合,因爲我正在傳遞Func委託。 Func委託對我來說有太多可能的聲明來實際編寫重載(並且未來可能會有更多)。我想我必須在Foo類的「客戶端」一側進行投射。 – Kiril 2010-05-20 09:27:16