假设以下程序:
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);
//...
但是,当我尝试它会说,类型参数不能从使用中产生,我应该尝试指定它们,但是如何?
答案 0 :(得分:5)
问题是(foo f) => f.bar
与Func<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
。