如何查看IReadOnlyDictionary使用的键比较器?

时间:2017-05-07 16:16:02

标签: c# dictionary case-insensitive

我想在方法中使用Dictionary<string, T>。该方法不需要修改Dictionary,因此我想将其作为IReadOnlyDictionary<string, T>传递。我想检查一下Dictionary的密钥比较器是否不区分大小写。如果它是Dictionary<string, T>那么我可以:

Diagnostics.Debug.Assert(abbreviations.Comparer == StringComparer.InvariantCultureIgnoreCase);

但似乎IReadOnlyDictionary没有Comparer属性。我能用什么替代上述断言?

2 个答案:

答案 0 :(得分:0)

Comparer<TKey> Comparer属性未实现接口。

一种实用的方法是尝试将参数强制转换为(ReadOnly)Dictionary<string, T>,但是你会违反你在API /接口/方法签名中做出的承诺。

另一种方法是,使签名更复杂,更容易出错,要求将字典及其比较器作为参数传递。但是,这将允许调用者传递任何比较器,不一定是应用于字典的比较器。

作为Emrah的suggested in comments,您可以引入一个界面:

public interface IComparableReadOnlyDictionary<TKey, TValue>
    : IReadOnlyDictionary<TKey, TValue>
{
    IEqualityComparer<TKey> Comparer { get; }
}

并介绍自己继承的字典类型:

public class ComparableReadOnlyDictionary<TKey, TValue>
: ComparableReadOnlyDictionary<TKey, TValue>,
  IComparableReadOnlyDictionary<TKey, TValue>
{   
}

但这不允许使用友好的公共API。

您也可以选择使用类型Dictionary<string, T>作为参数类型。

答案 1 :(得分:0)

这是你可以通过定义自己的界面来做的:)我希望它有所帮助

public interface IMyReadOnlyInterface<TKey, TValue> : IReadOnlyDictionary<TKey, TValue> {
IEqualityComparer<TKey> Comparer { get; }
}

public class MyReadOnlyDict<TKey, TValue> : Dictionary<TKey, TValue>, IMyReadOnlyInterface<TKey, TValue> {
}

public void TestMethod(IMyReadOnlyInterface<string, object> dict){
    var compareMe = dict.Comparer;
    //DO STUFF
}