[英]getting rid of redundant type parameters
我有一個泛型類A,另一個類B處理A的實例並包含一些額外的數據。 我需要有兩個單獨的類。 B不能從A繼承,因為A有其他衍生物,B需要包含對A的引用。
舉個簡單的例子,我想寫的是(字典是A,dicthandler是B):
class dicthandler<T> where T : Dictionary<Tk, Tv>
但它不編譯,我需要指定所有類型參數:
class dicthandler<T, Tk, Tv> where T : Dictionary<Tk, Tv>
但實際上我並不關心Tk和Tv是什么,所以它們完全是多余的,我只需要T.每當我想創建一個新實例時,我需要為構造函數指定所有類型參數,這會傷害我。
顯然我需要一些技巧。 有任何想法嗎?
不,沒有辦法做到這一點。 DictHandler
任何實例DictHandler
必須知道T
的確切類型,包括TKey
和TValue
的類型。
如果您實際擁有相關字典的實例,則可以使用類型推斷來減少顯式指定類型參數的頻率。 例如:
public static class DictHandler
{
public static DictHandler<T, TKey, TValue> CreateHandler<T, TKey, TValue>
(T dictionary1, Dictionary<TKey, TValue> dictionary2)
where T : Dictionary<TKey, TValue>
{
return new DictHandler<T, TKey, TValue>();
}
}
public class DictHandler<T, TKey, TValue> where T : Dictionary<TKey, TValue>
{
}
然后像這樣創建它:
Dictionary<string, int> dict = new Dictionary<string, int>();
var handler = DictHandler.CreateHandler(dict, dict);
我相信你必須擁有這兩個參數的原因是,參數(在類型推斷中使用的所有參數)最終與直接提及類型參數的參數相對應。 我不完全確定 - 這肯定有些難看。
另一種方法是為A創建一個非通用的基本類型或基本接口。 例如,在這種情況下(假設我們可以控制字典)我們創建:
public interface INonGenericDictionary
{
// Members which don't rely on the type parameters
}
public class Dictionary<TKey, TValue> : INonGenericDictionary
{
...
}
然后
public class DictHandler<T> where T : INonGenericDictionary
{
...
}
我們無法確定這是否適用於您的情況,但它可能是。
在對象構建方面,當前的C#要求你非常具體。 但是,這似乎不太經常創建,所以你可以從當前類型的type-parameters創建一個CreateDictHandler
類型:
private dicthandler<T, Tk, Tv> CreateDictHandler() {...}
...
var handler = CreateDictHandler();
如果類型參數用於方法 ,則必須為構造函數提供它們,但仍可以在變量聲明中使用var
。
您可能還會發現,在許多情況下, 過多的泛型實際上是一件壞事。 如果它開始變得過於粗糙,有時像IDictionary
(非泛型)這樣的東西真的是可取的。
您不能省略鍵和值類型參數,因為它們是泛型類型簽名的一部分。 但您考慮過將類型定義更改為此嗎?
class dicthandler<TKey, TValue>
然后你可以使用類型Dictionary<TKey, TValue>
。 很明顯,你的類型只能用於字典,所以不需要強制將這種類型作為泛型參數傳遞,因為你已經知道它是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.