2010-06-05 21 views
4

我有一個關於.net泛型的問題。請看下面的代碼:使用泛型從其他泛型參數

public abstract class Test<TKey> 
{ 
    TKey Key { get; set; } 
} 

public class Wrapper<TValue, TKey> 
    where TValue : Test<TKey> 
{ 
    public TValue Value { get; set; } 
} 

現在,使用此代碼時,我可以做這樣的事情:

Wrapper<Test<int>, int> wrapper = new Wrapper<Test<int>, int>(); 

int類型參數必須要提供兩次。是否可以修改Wrapper定義,要求TValue是一個泛型類型,並使用TKey類型參數中嵌套的泛型類型參數?

+0

可以測試''可能是'SomethingInheritingFromTest '呢?如果是這種情況,我沒有看到指定類型參數的方法,因爲你沒有類型,你可以提供相同的'T',因爲你不知道它是什麼,即使你創建了一個基地/包裝...更聰明的通用傢伙在這裏比我雖然,希望有人教我:) – 2010-06-05 21:48:24

回答

1

我想說這取決於你是否真的需要暴露你的Value財產作爲特定的TValue其中TValue來自Test<T>。換句話說,你需要是否需要來暴露只能派生類的功能,或者你能簡單地公開一個Test<T>以及基類的所有功能嗎?

在後一種情況下,可以簡化您的類定義爲:

public class Wrapper<TKey> 
{ 
    public Test<TKey> Value { get; set; } 
} 

至於你正在尋找的精確功能:我不相信過像那就是在當前可用版本的C#。

這就是說,在你的情況下,另一種選擇可能是實際使用您的Wrapper類本身作爲基類:

public abstract class Test<TKey> 
{ 
    TKey Key { get; set; } 
} 

public abstract class Wrapper<TValue, TKey> 
    where TValue : Test<TKey> 
{ 
    public TValue Value { get; set; } 
} 

public class TestWrapper<TKey> : Wrapper<Test<TKey>, TKey> 
{ } 

// ... some code somewhere 
var tw = new TestWrapper<int>(); 
Test<int> value = tw.Value; 
+0

雖然'測試'是一個抽象類,基於一個已刪除的問題中的意見,你不能看到相當尚未(如果我記得我的代表限制!),操作系統希望繼承自「測試」的類,而不是實際的類本身。他希望像'Wrapper '或'Wrapper '和'TestChild' *實際上*是'TestChild '......我相信答案是一樣的,儘管這並不存在。但是,嘿,也許有一種方法可以得到我不知道的...我相信IL可以做到這一點,但不知道C#。 – 2010-06-05 22:11:15