2013-11-19 1 views
1

Предположим следующую программка:Как передать выражение <Func<int>> к функции

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Linq.Expressions; 

namespace Lambda { 
    class Program { 
     public void TheFunction<T> (Expression<Func<T>> action) { 
     /** logic **/ 
     } 

     static void Main (string[] args) {  
      TheFunction(); //this will of course not compile, 
          // because the Lambda Expression is missing. 
     } 
    } 

    public class foo { 
     public int bar { get; set; } 
    } 
} 

Вопрос здесь в том, как назвать TheFunction? Цель состоит в том, чтобы работать с выражением>, чтобы получить имя свойства, помимо других вещей, в пределах функции.

Я хотел бы иметь что-то вроде этого:

//... 
TheFunction((foo f)=> f.bar); 
//... 

Но когда я пытаюсь это сказать, что аргументы типа не могут быть infered от использования и я должен попытаться определить их, но как?

ответ

5

Проблема (foo f) => f.bar не совместима с Func<T>. Ваша функция Ламба принимает один аргумент типа foo и возвращает int, следовательно, вы должны объявить TheFunction таким образом:

public void TheFunction<TArg, TResult> (Expression<Func<TArg, TResult>> action) { … } 

, то этот код будет компилироваться:

new Program().TheFunction((foo b) => b.bar); 

Примечание стороны: Main является статический метод, поэтому вам необходимо создать экземпляр Program, чтобы позвонить по телефону TheFunction.

+0

Было бы разумнее использовать именование 'Func ', чем у вас, поэтому я предлагаю вам изменить параметры типа на 'Func <,>'. –

+0

@JeppeStigNielsen Да, вы правы, я не дважды проверял документы ... Спасибо за это. –

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