2015-11-13 1 views
0

Извините за плохой титул я хочу сделать следующее в .NET 3.5.Вызов выражения лямбда напрямую? . (Ex Action.Invoke (() => {})

void Invoke(Action callback) 
{ 
    callback(); 
} 

Но мне интересно, если есть какая-то уже построен кол-классы, которые уже имеют эту функцию, например, если я мог бы сделать следующее, я был бы рад (но я знаю, что я не могу):.

Action.Run(()=>{}} 

Я знаю, что есть куча решений этой проблемы, например, писать собственный класс помощника или расширение. Но, как я уже сказал, мне интересно, можно ли обойтись без этого.

Для уточнения:

Я хочу, чтобы это решение, потому что у меня есть определение метода, как это:

private void HelloWorld(Action callback) 
{ 
#if DOTNET4.0+ //This code won't be compiled for DOTNET3.5 
    Action.Run(async()=>{ 
     await someTask; 
     callback(); 
    }); 
#else //This code will be 
    callback(); 
#endif 
} 

Поэтому я не хотел использовать Task.Run (...) Это потому, что я хотел для минимизации количества кода, зависящего от .NET4.0 +. Если нет альтернативы Task.Run (...), тогда я пойду с ним.

+0

Почему вы хотите добавить такой слой косвенности? Какое преимущество может быть «Action.Run (() => {Foo();})' имеет только «Foo()»? – spender

+0

Потому что мне нужно сделать следующее 'Invoke (async() => {await ...})', так что для определения моего метода не требуется ключевое слово async (пожалуйста, не спрашивайте меня, почему (у меня есть причины) !;)). – Whyser

+0

Итак 'Task.Run (async() => {await FooAsync();})' – spender

ответ

1

Ну, пустота лямбда без аргументов можно назвать так:

((Action)(()=>{}))() 

или

((Action)(()=>{})).Invoke() 

Вы всегда должны назначить тип для лямбды (даже неявно), перед вами разрешено работать с ним.

+0

Спасибо! Это основное решение, которое я искал! – Whyser

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