在词典中使用Action或FUNC

时间:2014-05-02 12:40:26

标签: c#

我想知道是否可以将模板传递给像这样的函数:

 Dictionary<string, Action<object>> myDict= new Dictionary<string, Action<object>>();
 myDict.Add("someString",(nameOfMethod));

此方法例如是一个setter,因此它接收参数(double或string或int etc ...)并返回void。

我想以下是不可能的.. (我得到了这个错误:错误最好的重载方法匹配&#39; System.Collections.Generic.Dictionary&gt; .Add(string,System.Action)&#39;有一些无效的参数)

任何想法怎么做?

1 个答案:

答案 0 :(得分:7)

  

此方法例如是一个setter,因此它接收参数(double或string或int etc ...)并返回void。

这就是问题所在 - 接受double的方法不适用于Action<object>,因为应该可以使用调用Action<object>任何 object引用作为参数。

您可以使用lambda表达式进行转换和转换:

myDict.Add("somestring", o => MethodAcceptingDouble((double) o));

你甚至可以编写一个辅助方法来执行此操作,但遗憾的是由于类型推断的限制,您需要明确指定类型参数。

static class Test
{
    static void Main()
    {
        var dictionary = new Dictionary<string, Action<object>>();
        AddAction<double>(dictionary, "somestring", SampleMethod);
    }

    static void AddAction<T>(Dictionary<string, Action<object>> dictionary,
                             string name,
                             Action<T> action)
    {
        dictionary.Add(name, arg => action((T) arg));
    }

    static void SampleMethod(double input)
    {
    }
}