我想知道是否可以将模板传递给像这样的函数:
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;有一些无效的参数)
任何想法怎么做?
答案 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)
{
}
}