Tag: 表达式树

编译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 […]

使用参数名称动态创建委托

嗨,我正在尝试创建一个动态创建一个委托的函数,该委托具有相同的返回值和与它作为参数接收的MethodInfo相同的参数,这也是相同的参数名称非常重要! 到目前为止我所做的是创建一个函数,该函数返回一个lambda,它接收相同的参数类型,并且具有与MethodInfo相同的返回值,但它没有参数名称: static void Example() { Person adam = new Person(); MethodInfo method = typeof(Person).GetMethod(“Jump”); Delegate result = CreateDelegate(adam, method); result.DynamicInvoke((uint)4, “Yeahaa”); } private static Delegate CreateDelegate(object instance, MethodInfo method) { var parametersInfo = method.GetParameters(); Expression[] expArgs = new Expression[parametersInfo.Length]; List lstParamExpressions = new List(); for (int i = 0; i < expArgs.Length; i++) { […]

尝试捕获每行代码而不使用单独的try-catch块

我目前没有这个问题 ,但你永远不知道,并认为实验总是很有趣。 忽略你的架构甚至要尝试这个问题所必须遇到的明显问题 ,让我们假设你有一些别人设计的可怕编写代码,你需要在相同的代码中做一堆广泛而多样的操作阻止,例如: WidgetMaker.SetAlignment(57); contactForm[“Title”] = txtTitle.Text; Casserole.Season(true, false); ((RecordKeeper)Session[“CasseroleTracker”]).Seasoned = true; 乘以一百。 其中一些可能有效,另一些可能会出错。 你需要的是C#相当于“on next resume next”,否则你将最终复制并粘贴许多代码行的try-catches。 你会如何解决这个问题?

如何从字符串为深属性创建表达式树/ lambda

给定一个字符串:“Person.Address.Postcode”我希望能够在Person的实例上获取/设置此postcode属性。 我怎样才能做到这一点? 我的想法是将字符串拆分为“。” 然后迭代这些部分,寻找前一个类型的属性,然后构建一个看起来像(伪语法道歉)的表达式树: (person => person.Address) address => address.Postcode 我在实际创建表达式树时遇到了麻烦! 如果这是最好的方式,有人可以建议如何去做,还是有更简单的选择? 谢谢 安德鲁 public class Person { public int Age { get; set; } public string Name { get; set; } public Address Address{ get; set; } public Person() { Address = new Address(); } } public class Address { public string Postcode { […]

如何分解成员访问表达式链?

短版(TL; DR): 假设我有一个表达式,它只是一个成员访问运算符链: Expression<Func> e = x => x.foo.bar.baz; 您可以将此表达式视为子表达式的组合,每个子表达式包含一个成员访问操作: Expression<Func> e1 = (Tx x) => x.foo; Expression<Func> e2 = (Tfoo foo) => foo.bar; Expression<Func> e3 = (Tbar bar) => bar.baz; 我想要做的是将这些组件子表达式分解,以便我可以单独使用它们。 更短的版本: 如果我有表达式x => x.foo.bar ,我已经知道如何中断x => x.foo 。 如何拉出另一个子表达式foo => foo.bar ? 为什么我这样做: 我试图在C#中模拟“提升”成员访问操作符,就像CoffeeScript的存在访问操作符一样?. 。 Eric Lippert表示, 类似的运营商被考虑用于C#,但没有预算来实施它。 如果这样的运算符存在于C#中,您可以执行以下操作: value = target?.foo?.bar?.baz; 如果target.foo.bar.baz链的任何部分结果为null,那么整个事情将评估为null,从而避免NullReferenceException。 […]

有没有办法创建一个委托来获取和设置FieldInfo的值?

对于属性,有GetGetMethod和GetSetMethod以便我可以这样做: Getter = (Func)Delegate.CreateDelegate(typeof(Func), propertyInfo.GetGetMethod()); 和 Setter = (Action)Delegate.CreateDelegate(typeof(Action), propertyInfo.GetSetMethod()); 但是我该如何处理FieldInfo ? 我不是在寻找GetValue和SetValue代表(这意味着我每次都会调用reflection) Getter = s => (T)fieldInfo.GetValue(s); Setter = (s, t) => (T)fieldInfo.SetValue(s, t); 但是如果这里有CreateDelegate方法吗? 我的意思是, 因为赋值返回一个值 ,我可以将赋值视为一种方法吗? 如果有的话,它有一个MethodInfo句柄吗? 换句话说,我如何传递正确的MethodInfo设置并从成员字段获取值到CreateDelegate方法,以便我得到一个委托,我可以直接读取和写入字段? Getter = (Func)Delegate.CreateDelegate(typeof(Func), fieldInfo.??); Setter = (Action)Delegate.CreateDelegate(typeof(Action), fieldInfo.??); 我可以构建表达式并编译它,但我正在寻找更简单的东西。 最后,如果问题没有答案,我不介意去表达路线 ,如下所示: var instExp = Expression.Parameter(typeof(S)); var fieldExp = Expression.Field(instExp, fieldInfo); Getter = Expression.Lambda<Func>(fieldExp, instExp).Compile(); […]

Linq2SQL“或/和”运算符(ANDed / ORed条件)

假设我们需要应用几个条件来选择一个名为“Things”的表(未知计数和性质) 如果条件已知,我们可以写 db.Things.Where(t=>foo1 && foo2 || foo3); 但是如果我们必须以编程方式构建Where条件,我可以想象我们如何应用ANDed条件 IQuerable DesiredThings = db.Things.AsQuerable(); foreach (Condition c in AndedConditions) DesiredThings = DesiredThings.Where(t => GenerateCondition(c,t)); ORed条件怎么样? 注意:我们不想执行union,unique或任何其他代价高昂的操作,我们希望生成一个查询,好像我们将它写成ad-hock 提前致谢。 加成: PredicateBuilder:动态编写表达式谓词

变量”类型”从范围”引用,但它没有定义

那么,以下代码是自我解释的; 我想使用And运算符将两个表达式合并为一个。 最后一行导致符文时间错误: 附加信息:从范围”引用的’System.String’类型的变量’y’,但未定义 码: Expression<Func> e1 = y => y.Length < 100; Expression<Func> e2 = y => y.Length < 200; var e3 = Expression.And(e1.Body, e2.Body); var e4 = Expression.Lambda<Func>(e3, e1.Parameters.ToArray()); e4.Compile(); // <— causes run-time error

使用Lambda表达式调用通用方法(以及仅在运行时已知的类型)

您可以使用Lambda表达式对象将lambda表示为表达式。 如果在运行时只知道用于generics方法签名的类型,如何创建表示generics方法调用的Lambda表达式对象 ? 例如: 我想创建一个Lambda表达式对象来调用: public static TSource Last( this IEnumerable source ) 但我只知道TSource在运行时是什么。

从表达式树访问索引器

我正在研究过滤function。 filter将是用户构建的表达式树。 用户可以使用大约30个字段进行过滤。 我认为最好的方法是使用索引器创建对象模型,并通过枚举类型的索引访问所需的值。 看这个例子: enum Field { Name, Date, } class ObjectModel { object this[Field Key] { get { //… return xx; } } } 我想问一下如何从表达式树中访问索引器。