我想在方法中使用Dictionary<string, T>
。该方法不需要修改Dictionary,因此我想将其作为IReadOnlyDictionary<string, T>
传递。我想检查一下Dictionary的密钥比较器是否不区分大小写。如果它是Dictionary<string, T>
那么我可以:
Diagnostics.Debug.Assert(abbreviations.Comparer == StringComparer.InvariantCultureIgnoreCase);
但似乎IReadOnlyDictionary没有Comparer属性。我能用什么替代上述断言?
答案 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
}