如何制作字典扩展方法?

21

我正在尝试编写一个Dictionary扩展,可以独立于Key/Value的数据类型进行工作。我尝试使用object数据类型传递它,并假设它可以与任何类型一起使用。

我的代码:

 public static class DictionaryExtensionsClass
    {
        public static void AddFormat(this Dictionary< ?? unknow type/*object*/, ??unknow type/*object*/> Dic, ??unknow type/*object*/ Key, string str, params object[] arglist)
        {
            Dic.Add(Key, String.Format(str, arglist));
        }
    }
1个回答

45

你只需将这个方法改为泛型:

public static void AddFormat<TKey>(this Dictionary<TKey, string> dictionary,
    TKey key,
    string formatString,
    params object[] argList)
{
    dictionary.Add(key, string.Format(formatString, argList));
}

请注意,它只是在类型上是通用的,因为值必须是string(或者可能是object或实现string接口的接口),因为您将向其添加字符串值。

不幸的是,您无法真正表达“仅允许值类型,其中string是有效值”的约束条件在通用类型约束中。


谢谢你的回答。 :) 我已经改变了代码,但是当我将变量类型更改为 Dictionary<WaringType, string>() 时(其中 WaringType 是一个枚举型),我收到一个错误:'System.Collections.Generic.Dictionary<myclass.WaringType,string>' 不包含 'AddFormat' 的定义,并且找不到接受第一个参数类型为 System.Collections.Generic.Dictionary<myclass.WaringType,string>' 的 'AddFormat' 的扩展方法(是否缺少 using 指令或程序集引用?) - Jack
当我调用该方法时:ErrMessages.AddFormat(WaringType.FatalError, "{0} foo {1} baa etc", a.Name, a.Value); - Jack
2
如果您在不同的命名空间中工作,请确保有一个“using”语句使具有扩展方法的类可见。尝试显式调用您的扩展方法,如DictionaryExtensionsClass.AddFormat(theDictionary, key, format, ...);以检查其可见性。 - Wormbo
@Wormbo:谢谢。当我在自动完成中看到DictionaryExtensionsClass时,我看到了方法名称和我的拼写错误。当我按照Jon Skeet的建议重写代码时,我在Forma**t**tAdd()方法名称上添加了一个t。非常抱歉给您带来的不便。 - Jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接