2013-03-18 69 views
2

我有如下定義一個類:鑄造一個泛型實例到非一般的一個

class ProxyWithSetter<T> : ProxyValue where T : Value 

它的類型

Action<T> Setter; 

說我有ProxyValue實例列表的領域,其中一些也是ProxyWithSetter,我怎麼能通過一個對象,類型是Value的子類,我確定是ProxyWithSetter的那些ProxyValue之一?

這裏的問題是我需要將其中一個ProxyValue s投射到ProxyWithSetter,但是投射也需要一個類型參數。我不能提供,因爲精確類型的對象我要傳遞給函數不知道在編譯時間。我只知道它應該是Value的子類型。

基本上,我想做的事,因爲pProxyWithSetter<Value>類型的不是這個

(p as ProxyWithSetter<Value>).Setter(val); 

演員返回空值,但是沒有辦法知道確切的類型是。我也不知道EXACT類型val。只要知道它確實是一個Value

我可以理解爲什麼它不起作用。我只是在尋找一個可行的解決方法。

+0

p最初是什麼類型? (我不明白動作適合在哪裏) – James 2013-03-18 20:40:31

+0

動作是ProxyWithSetter 的一個字段。它在實例創建時被設置爲某種具體類型,但隨後所有這些實例都被推入列表,並且具體類型丟失。 – 2013-03-18 20:42:11

回答

0

您可以創建這個接口:

interface IProxyWithSetter 
{ 
    Action<Value> Setter { get; } 
} 

並執行它是這樣的:

class ProxyWithSetter<T> : ProxyValue, IProxyWithSetter where T : Value 
{ 
    Action<Value> IProxyWithSetter.Setter { get { return x => this.Setter((T)x); } } 

    //other things 
} 

這樣一來,在類型是靜態已知的情況下,你Setter將採取T,但在你說的方法中,你可以做一個as IProxyWithSetter,然後打電話給Setter(val)

+0

這對我的最終解決方案來說非常接近(也許更優雅)。我會將其標記爲已接受的答案。 – 2013-03-19 20:34:47

0

可以使用

p.GetType() 

使用這種獲取關於類型的信息,你會得到一個類型的對象,其字符串表示是一樣的東西

ProxyWithSetter[Value] 

您可以訪問泛型類型與

p.GetType().GenericTypeArguments 

一個由所有類型對象組成的數組,它們是通用參數rs爲你的班級。 然後,只需檢查

p.getType().GenericTypeArguments == typeof(Value) 
+0

但實際檢查哪個ProxyValue是ProxyWithSetter不是問題。我在解決方案中解決了不同的問題。問題是我需要將它轉換爲「真」類型,所以我可以調用它作爲字段的泛型函數。此外,我需要傳遞一個值給該函數,所以即使我設法投出它,我仍然需要將該值轉換爲適當的類型... – 2013-03-18 21:07:04

+0

我試過了。當類型(包括泛型參數)正確時,一切正常。你能提供崩潰的代碼嗎? – 2013-03-18 21:38:39

0

你不能做什麼你問。即使你製作了一個包含Setter(它必須是一個屬性,而不是一個字段)的逆變界面,它也只能得到T或更多派生類型的項目。

舉例來說,如果你有一個類SuperValue其子類Value,然後你有ProxyWithSetter<SuperValue>一個實例,你不能的Value一個實例傳遞給它。它必須是SuperValue或子類SuperValue

所以問題是,並非每個ProxyWithSetter<T>都可以接受ValueSetter的輸入。