如何传递Expression <func <int>&gt;到函数</func <int>

时间:2013-11-19 10:32:39

标签: c# .net linq lambda

假设以下程序:

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?目标是使用表达式&gt;除了其他内容之外,还要在TheFunction中检索属性名称。

我想有这样的事情:

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

但是,当我尝试它会说,类型参数不能从使用中产生,我应该尝试指定它们,但是如何?

1 个答案:

答案 0 :(得分:5)

问题是(foo f) => f.barFunc<T>不兼容。您的lamba函数接受foo类型的一个参数并返回int,因此您必须以这种方式声明TheFunction

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

然后这段代码编译好了:

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

附注:Main是一种静态方法,因此您需要首先实例化Program才能调用TheFunction