簡體   English   中英

擺脫冗余類型參數

[英]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的確切類型,包括TKeyTValue的類型。

如果您實際擁有相關字典的實例,則可以使用類型推斷來減少顯式指定類型參數的頻率。 例如:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM