使用值作为Action 的实例创建Dictionary的语法是什么?

我需要创建一个Dictionary对象作为成员字段
key = string
value = Action一个实例,其中每个条目的T可能不同,例如long,int,string(ValueType或RefType)

但是无法让编译器在这里同意我的意见。要创建一个成员字段,它似乎需要一个固定的T规范。 在意识到“这不应该是这么困难”之前,我已经超越了我的奋斗时间限制

可能是一个普通的菜鸟错误。 请指教..

用法就是这样的

 m_Map.Add("Key1", new delegate(long l) {Console.Writeline("Woohoo !{0}", l.ToString();)); 

基本上你不能。 编译器如何知道您对任何特定条目感兴趣的类型?

你甚至无法解释Dictionary>的关系,其中每个字典条目都有一个类型的键和一个使用该类型的动作。 generics只是不支持这种关系。

如果您在尝试使用它时知道该类型,则可以将其设为Dictionary并在获取时转换该值。 或者,你可以使用Action并与拳击一起生活并投射你最终。

请注意,要仅使用Delegate使用匿名方法或lambda表达式,您需要强制转换或编写一个方便的转换方法:

 public static Delegate ConvertAction(Action action) { return action; } 

这样你就可以写:

 Delegate dlg = ConvertAction((long x) => Console.WriteLine("Got {0}", x)); 

或在字典上下文中:

 var dict = new Dictionary(); dict["Key1"] = ConvertAction((long x) => Console.WriteLine("Got {0}", x)); 

当你再次从字典中取出值时,你仍然需要转换为正确的类型…

一个不同的大头…

您可以将字典封装在您自己的类型中,并使用通用的Add方法,而不是直接公开字典:

 public void Add(string key, Action action) 

所以它仍然是幕后的Dictionary ,但是你的类型会确保它只包含代表一个参数的值。

每个条目使用不同的T ,可能在Action标准化,并在实际操作中进行转换?

  static void Main() { var m_Map = new Dictionary>(); m_Map.Add("Key1", obj => Console.WriteLine("Woohoo !{0}", obj)); m_Map.Add("Key2", obj => SomeMethod((int)obj)); m_Map["Key1"](123); m_Map["Key2"](123); } static void SomeMethod(int i) { Console.WriteLine("SomeMethod: {0}", i); }