c#delegate在没有完整声明的情况下声明

时间:2014-02-06 23:23:00

标签: c# delegates

我有代表

public delegate object ABC(object a);

我还有其他一些想做的课

new Dictionary<string,object>(){

{"key1",delegate(object val){return "blah"}},

{"key2",delegate(object val){return "blah2"}}};

问题是如果我没有像这样提前声明委托

ABC del = delegate(object val){return "blah"};

然后在我的字典中粘贴del,它将无法编译,因为在那里使用ABC以某种方式告诉它如何将其存储为对象,其中作为第一个示例它不知道委托类型是什么。

问题是,任何缩短它的方法,所以我不必在字典之外声明变量。像

这样的东西

delegate<ABC>(object val){return "blah1"}

这样的事情是否存在?

4 个答案:

答案 0 :(得分:1)

为什么不像这样Dictionary<string,ABC>定义你的字典,那么你可以这样做:

var dict = new Dictionary<string, ABC> 
   {
      {"key1", delegate (object obj) { return "blah"; }}
   };

或者您可以使用lambda语句:

var dict = new Dictionary<string, ABC> {{"key1", obj => "blah" }};

答案 1 :(得分:1)

无需像这样创建自定义委托。只需使用System.Func<T,TResult>

var dict = new Dictionary<string,Func<object,object>> 
{
  {"Blah", x => "Blah",},
  {"Blah2", x => "Blah2"}
};

答案 2 :(得分:0)

如果您的值都是ABC个实例,则可以更精确地指定字典值类型:

var d = new Dictionary<string,ABC>()
{
    {"key1",delegate(object val){return "blah";}},
    {"key2",delegate(object val){return "blah2";}}
}

答案 3 :(得分:0)

如果我正确理解你的目标,你可以使用lambdas来实现这个目标:

private delegate object ABC(object a);

private Dictionary<string, ABC> dict = new Dictionary<string, ABC>
    {
        { "key1", a => "blah1" },
        { "key2", a => { return "blah2"; } }
    };

请注意,我已经用两种不同的方式表达了相同的功能。用于key1的lambda是简化的,与key2的lambda具有相同的含义。我会为a分配object值,并将其传递给您的代表。