Tag: lambda

从表达式调用方法

使用Expression.Call时,方法“Any”有哪些类型和参数? 我有一个内部和外部表达式,我想与Any一起使用。 表达式以编程方式构建。 内在(这是有效的): ParameterExpression tankParameter = Expression.Parameter(typeof(Tank), “t”); Expression tankExpression = Expression.Equal( Expression.Property(tankParameter, “Gun”), Expression.Constant(“Really Big”)); Expression<Func> tankFunction = Expression.Lambda<Func>(tankExpression, tankParameter); 外面(看起来正确): ParameterExpression vehicleParameter = Expression.Parameter(typeof(Vehicle), “v”); Expression vehicleExpression = Expression.Lambda( Expression.Property( vehicleParameter, typeof(Vehicle).GetProperty(“Tank”)), vehicleParameter); 这给了我两个表达式: v => v.Tank t => t.Gun == “Really Big”; 而我正在寻找的是: v => v.Tank.Any(t => t.Gun == “Really Big”); […]

检索在Func中执行的调用方法的名称

我想获得被委派为Func的方法的名称。 Func func = x => x.DoSomeMethod(); string name = ExtractMethodName(func); // should equal “DoSomeMethod” 我怎样才能做到这一点? – 吹牛的权利 – Make ExtractMethodName也可以使用属性调用,让它返回该实例中的属性名称。 例如。 Func func = x => x.Property; string name = ExtractMethodName(func); // should equal “Property”

是否可以在c#中的lambda表达式中使用可选/默认参数?

有没有办法在c#中使用带有lambda表达式的 可选参数 (默认参数)? 我已经阅读了文档,但却找不到任何说法。 为了说明,我可以定义使用可选参数提供默认值的简单方法,如下所示: void MyMethod(string arg = “default-value”) { Console.WriteLine(arg); } 我想知道的是,如果我能够使用lambda表达式做同样的事情。 // gives a syntax error Action MyMethod = (arg = “default”) => Console.WriteLine(arg); 我可以使用委托使用默认值的可选参数,但这看起来有点笨拙。 delegate void MyDelegate(string arg = “default”); MyDelegate MyMethod = arg => Console.WriteLine(arg); 或者我可以检查lambda体中的参数,例如… Action MyMethod = (arg) => Console.WriteLine(string.IsNullOrEmpty(arg) ? “default” : arg); 但这再次看起来有点笨拙。 是否可以使用可选参数在c#中的lambda表达式中设置默认值?

使用ExpressionVisitor获取所有“where”调用

我有一个查询,像这样: var query = from sessions in dataSet where (names.Contains(sessions.Username)) where (sessions.Login.TimeOfAction == dt) select new { sessions.Username, sessions.Login, sessions.Logout, sessions.Duration }; 我想实现一个ExpressionVisitor来提取where子句作为Lambda,但到目前为止只能使用一个名为’InnermostWhereFinder’的类来获得第一个,该类来自TerraServer Web服务的自定义查询提供程序上的MSDN教程。 它是: internal class InnermostWhereFinder : ExpressionVisitor { private MethodCallExpression innermostWhereExpression; public MethodCallExpression GetInnermostWhere(Expression expression) { Visit(expression); return innermostWhereExpression; } protected override Expression VisitMethodCall(MethodCallExpression expression) { if (expression.Method.Name == “Where”) innermostWhereExpression = […]

调用Func 时为什么会出错?

我在C#中有以下代码片段: var actions = new List<Func>(); IEnumerable values = new List { 1, 2, 3 }; foreach (int value in values) { actions.Add(() => value * value); } foreach (var action in actions) { Console.WriteLine(action()); ; } Console.ReadLine(); 它运行正常,但我没有得到我期望的结果。 实际结果 9,9,9 预期结果 1,4,9 为什么我没有得到我期望的结果?

.Net lambda表达式 – 这个参数来自哪里?

我是一个lambda新手,所以如果我在描述中缺少重要信息,请告诉我。 我会尽可能简单地保持这个例子。 我正在查看其他人的代码,他们有一个inheritance自另一个的类。 这里首先是派生类,以及我无法理解的lambda表达式: class SampleViewModel : ViewModelBase { private ICustomerStorage storage = ModelFactory.Create(); public ICustomer CurrentCustomer { get { return (ICustomer)GetValue(CurrentCustomerProperty); } set { SetValue(CurrentCustomerProperty, value); } } private int quantitySaved; public int QuantitySaved { get { return quantitySaved; } set { if (quantitySaved != value) { quantitySaved = value; NotifyPropertyChanged(p => QuantitySaved); //where […]

使用条件(三元)运算符分配lambda表达式

我试图使用条件(三元)运算符将适当的lambda表达式分配给变量,具体取决于条件,但我得到编译器错误: 无法确定条件表达式的类型,因为’lambda表达式之间没有隐式转换’和’lambda表达’ 。 我可以使用常规的if-else来解决这个问题,但是条件运算符对我来说更有意义(在这个上下文中),会使代码更简洁添加,至少,我想知道它为什么没有的原因’工作。 // this code compiles, but is ugly! 🙂 Action hh; if (1 == 2) hh = (int n) => Console.WriteLine(“nope {0}”, n); else hh = (int n) => Console.WriteLine(“nun {0}”, n); // this does not compile Action ff = (1 == 2) ? (int n) => Console.WriteLine(“nope {0}”, n) : (int […]

linq到实体,where where子句在哪里? (内在哪里)

我有一个表与一对多映射到一个表,该表具有多个到另一个表的映射。 我想做以下事情: var results = context.main_link_table .Where(l => l.some_table.RandomProperty == “myValue” && l.some_table.many_to_many_table .Where(m => m.RandomProperty == “myValue”)); 我怎样才能做到这一点? 第一部分可以工作,但是在没有’内部WHERE’的情况下尝试它时,我无法访问many_to_many_table的属性,但“内在的地方”显然无法编译。 我基本上想要实现类似下面的SQL查询: SELECT * from main_link_table INNER JOIN some_table AS t1 ON t1.association = main_link_table.association INNER JOIN many_to_many_table AS t2 ON t2.association = some_table.association WHERE t1.RandomProperty = ‘MyValue’ AND t2.RandomProperty = ‘MyValue’ 它看起来很简单,但我无法找到一种方法来实现它在一行linq中 – 使用多行来实现所需的效果返回太多的结果,我最终不得不循环它们。 我也尝试过这样的东西: […]

编译lambda表达式会导致委托使用Closure参数

当我使用Expression.Lambda( … ).Compile()来从表达式树创建委托时,结果是一个委托,其第一个参数是Closure 。 public static Func CreateTest() { ParameterExpression a = Expression.Parameter( typeof( T ) ); ParameterExpression b = Expression.Parameter( typeof( T ) ); Expression addition = Expression.Add( a, b ); return (Func)Expression.Lambda( addition, a, b ).Compile(); } … // ‘addition’ equals // Int32 lambda_method( // System.Runtime.CompilerServices.Closure, // Int32, // Int32 ) Func addition […]

如何从lambda表达式获取引用实例的实例

我有这个lambda表达式Expression<Func> commandToExecute 然后我用一个方法传递一个类的实例: _commandExecuter.ProcessCommand (() => aClass.Method()) 如何在ProcessCommand方法中获取aClass的实例? 我想执行此类的一些addiontal方法或获取一些属性值。 这可能吗? 编辑:我现在已经编写了一个简单的静态助手方法来获取实例: private static object GetReferredProviderInstance(Expression body) { var methodCallExpression = body as MethodCallExpression; if (methodCallExpression != null) { var constantExpression = methodCallExpression.Object as ConstantExpression; if (constantExpression != null) return constantExpression.Value; } return null; } 方法调用看起来像这样…… Expression body = commandToExecute.Body; // this is the method parameter […]