IDictionary <string,string>或NameValueCollection

Ben*_*ard 6 c#

我目前正在编写一个接口,允许应用程序将异常数据发送到中央存储库以获得支持.我对如何传递额外的上下文数据感到困惑:

public interface IExceptionNotifier
{
    void Notify(Exception ex, NameValueCollection context); //this      
    void Notify(Exception ex, IDictionary<string, string> context); //or this
}
Run Code Online (Sandbox Code Playgroud)

在创建查找时,我经常发现自己处于类似的位置.忽略异常通知程序概念是否良好,是否最好使用IDictionary<string, string>NameValueCollection?你为什么选择一个?

Jon*_*eet 5

(假设.NET 3.5在这里.在.NET 3.5之前,NameValueCollection可以将多个值绑定到一个键上,而在"普通"集合中没有直接的等价物.)

您希望密钥具有潜在的多个值吗?如果是这样,我会考虑ILookup <TKey,TValue>.否则,我会去IDictionary <TKey,TValue>.

除了其他任何东西,如果接收者想要进行LINQ对他们有用的任何处理,那么任何一个通用接口都会比NameValuePair更好.同样,如果调用者已经拥有泛型或动态类型的上下文,则使用LINQ生成字典/查找可能更容易.


Ore*_*ost 1

如果上下文是一个一次性值并且(这里是重要的部分)不会被序列化,例如将数据发送到另一个系统,我会选择 IDictionary,因为它使您的界面的使用更加灵活。

另一方面,如果上下文始终保留或者上下文将被序列化,请使用 NameValueCollection,因为这样您就可以控制从调用者处实际获得的内容。

编辑:mausch 是正确的,您应该使用通用方法,但如果您想序列化数据,我仍然不会使用接口。