2014-02-06 1 views
0

У меня есть делегатC# делегат объявляется без полного заявления

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 там каким-то образом lls, как сохранить его как объект, где в качестве первого примера он не знает, что такое тип делегата.

Вопрос в том, чтобы каким-либо образом сократить его, поэтому мне не нужно объявлять переменные за пределами словаря. Что-то вроде

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

Существует ли что-нибудь подобное?

ответ

1

нет необходимости создавать собственный пользовательский делегат. Просто используйте System.Func<T,TResult>:

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

Если значения всех ABC экземпляров можно указать словарный тип значения более точно:

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

Почему вы не определить свой словарь как этот Dictionary<string,ABC>, то вы можете сделать:

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

Или вы можете использовать пояснения для лямбда:

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

Если я правильно понимаю вашу цель правильно, вы можете использовать лямбды для достижения этой цели:

private delegate object ABC(object a); 

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

Обратите внимание, что я выразил такую ​​же функциональность двумя различными способами. Лямбда, используемая для key1, упрощена и имеет то же значение, что и лямбда для key2. a будет присвоено значение object, которое передается в ваш делегат.

Смежные вопросы