簡體   English   中英

在C#中如何獲取不同的IEqualityComparer <T> 泛型類型實現接口的實例

[英]In C# how to get different IEqualityComparer<T> instance if generic type implements an interface

我有一個不受約束的泛型類型的泛型方法。 如果類型T實現了接口,則我需要獲得其他IEqualityComparer。

代碼大致如下所示:

public SomeState MergeCollection<T>(
    ICollection<T> thisValue, 
    ICollection<T> otherValue, 
    SomeStrategy strategy = SomeStrategy.Default, 
    IEqualityComparer<T> comparer = null)
{
    comparer = comparer ?? GetComparer<T>(strategy);
    // code using comparer
}

public IEqualityComparer<T> GetComparer<T>(SomeStrategy strategy)
{
    if(typeof(IMerge).IsAssignableFrom(typeof(T)))
    {
        return GetMergeComparer<T>(strategy);
    }
    else
    {
        return EqualityComparer<T>.Default;
    }
}

似乎是模板專業化的典​​型情況,但據我所知,C#不支持該功能。 我也在考慮靜態類實現策略模式以交換用於獲取比較器的功能,但是所有類型都將實現靜態,因此有必要進行類型方法字典查找。 為此生成IL代碼似乎是不得已而為之,考慮到該代碼使用率不高,因此不值得付出努力。

改變相關方法的行為的最佳方法是什么,以便如果T實現IMerge,它將獲得特殊情況? 我問,因為從理論上講,如果在運行時不會改變行為,則應該有可能在編譯時或至少在初始化時定義行為(靜態構造函數)。

  1. 我認為您現有的代碼沒有任何問題。 我個人會保持原樣。

    在您有證據表明它對性能至關重要的是過早的優化之前,IMO會對其進行優化。

  2. 如果您確實想緩存比較的結果,則可以使用以下方法:

     static class MergeComparerHelper<T> { static bool SupportsMerge = typeof(IMerge).IsAssignableFrom(typeof(T)); } 

    這利用了每個泛型實例都具有其自己的靜態字段的事實。 您可以為此使用私有嵌套類。

    但是請注意,由於.NET JITter的當前實現不會為不同的引用類型T生成專門的實現,因此這仍然會增加運行時調度的成本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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