Tag: 表达式树

如何在没有.Compile()的情况下从MemberExpression获取属性值?

我试图在不使用.Compile()的情况下从表达式树中获取对象的值时遇到问题 对象很简单。 var userModel = new UserModel { Email = “John@Doe.com”}; 给我问题的方法看起来像这样。 private void VisitMemberAccess(MemberExpression expression, MemberExpression left) { var key = left != null ? left.Member.Name : expression.Member.Name; if (expression.Expression.NodeType.ToString() == “Parameter”) { // add the string key _strings.Add(string.Format(“[{0}]”, key)); } else { // add the string parameter _strings.Add(string.Format(“@{0}”, key)); // Potential NullReferenceException var […]

如何使用表达式树创建一个空委托?

使用匿名方法,您可以创建自C#2.0以来的空委托。 public event EventHandler SomeEvent = delegate {}; public event Action OtherEvent = delegate {}; 这对于防止在调用事件时必须进行空检查非常有用 。 如何使用表达式树创建相同的行为? 我现在看到的唯一可能的选择是使用Expression.Lambda() ,但据我所知,这将需要大量的额外工作。

编译表达树误解了吗?

我有这个表达式: Expression<Func> f = s => s.Length < 5; ParameterExpression p = Expression.Parameter (typeof (string), “s”); MemberExpression stringLength = Expression.Property (p, “Length”); ConstantExpression five = Expression.Constant (5); BinaryExpression comparison = Expression.LessThan (stringLength, five); Expression<Func> lambda= Expression.Lambda<Func> (comparison, p); //让:测试 Func runnable = lambda.Compile(); Console.WriteLine (runnable (“kangaroo”)); // False Console.WriteLine (runnable (“dog”)); //True 我想问一下.Compile() 什么编译? 第一次执行与后期执行之间的区别是什么? […]

在Monotouch中编译lambdas并在设备上调用委托

我目前正在MonoTouch中移植.NET代码库,我目前正在研究一种接收Expression 。 我正在尝试编译它,然后动态调用它。 这是我做的: // Here’s an example of what I could receive Expression<Action> expression = (a => Console.WriteLine (a * 2)); // And here’s what I’m trying to do to invoke it expression.Compile().DynamicInvoke(6); 这在iOS模拟器中工作正常,结果“12”在我的控制台中打印。 但后来我在iPad上尝试了,我收到了以下exception。 Object reference not set to an instance of an object at System.Linq.jvm.Runner.CreateDelegate () at System.Linq.Expressions.LambdaExpression.Compile () at System.Linq.Expressions.Expression`1[System.Action`1[System.Int32]].Compile () […]

C#:编译表达式时,已添加具有相同键的项

好的,这是一个棘手的问题。 希望这里有一位表达大师可以发现我在这里做错了什么,因为我只是没有得到它。 我正在构建用于过滤查询的表达式。 为了简化这个过程,我有一些Expression<Func>扩展方法,这些方法使我的代码更清晰,到目前为止它们已经很好地工作了。 我已经为所有人编写了测试,除了一个,我今天写了一个。 并且该测试完全失败,带有长堆栈跟踪的ArgumentException 。 我只是不明白。 特别是因为我在查询中成功使用了该方法一段时间了! 无论如何,这是运行测试时得到的堆栈跟踪: failed: System.ArgumentException : An item with the same key has already been added. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) at System.Linq.Expressions.ExpressionCompiler.PrepareInitLocal(ILGenerator gen, ParameterExpression p) at System.Linq.Expressions.ExpressionCompiler.GenerateInvoke(ILGenerator gen, InvocationExpression invoke, StackType ask) at System.Linq.Expressions.ExpressionCompiler.Generate(ILGenerator gen, Expression node, StackType ask) at System.Linq.Expressions.ExpressionCompiler.GenerateBinary(ILGenerator gen, […]

LINQ表达式。 从范围引用的变量’p’,但未定义

我正在使用此代码动态构建LINQ查询。 它似乎工作,但当我在我的搜索中有多个searchString时(所以当添加多个表达式时,我得到以下错误: 从范围引用的变量’p’,但未定义** 我想我只能定义/使用p一次。 但是,如果是这样,我需要稍微改变我的代码。 任何人都能指出我在正确的方向吗? if (searchStrings != null) { foreach (string searchString in searchStrings) { Expression<Func> containsExpression = p => p.Name.Contains(searchString); filterExpressions.Add(containsExpression); } } Func[] operators = new Func[] { Expression.AndAlso }; Expression<Func> filters = this.CombinePredicates(filterExpressions, operators); IQueryable query = cachedProductList.AsQueryable().Where(filters); query.Take(itemLimit).ToList(); << **error when the query executes** public Expression<Func> CombinePredicates(IList<Expression<Func>> predicateExpressions, Func […]

使用VS2015 Update 1编译时表达式破坏代码

在我的机器上安装Visual Studio 2015 Update 1之后,我看到我的一些unit testing失败了。 在做了一些调查后,我能够将问题减少到这行代码: Expression<Func> expression = t => tX == 0 && tY == 0 && t.GameObjectType == GameObjectType.WindMill; 将鼠标hover在表达式变量上时,Visual Studio版本中的结果会有所不同: VS 2015: VS 2015 Update 1: 正在对枚举进行比较的逻辑(ServiceStack.OrmLite代码中的某个地方)现在采取了不同的行为,最终导致枚举不被识别为枚举,从而导致unit testing失败。 我能够使用以下代码重现该问题: class Program { static void Main(string[] args) { var gameObjects = new List { new GameObject { X = 0, Y […]

如果直到运行时才知道类型,如何创建Expression.Lambda?

最好使用代码解释。 我有一个generics类,它有一个返回整数的方法。 这是一个简单的版本,用于解释… public class Gen { public int DoSomething(T instance) { // Real code does something more interesting! return 1; } } 在运行时,我使用reflection来发现某事物的类型,然后想要为该特定类型创建我的Gen类的实例。 这很容易,像这样做…… Type fieldType = // This is the type I have discovered Type genericType = typeof(Gen).MakeGenericType(fieldType); object genericInstance = Activator.CreateInstance(genericType); 我现在想要创建一个Expression,它将参数作为generics类型的一个实例,然后调用该类型的DoSomething方法。 所以我希望Expression能有效地执行此操作…… int answer = genericInstance.DoSomething(instance); …除了我之前在运行时稍后没有’实例’并且genericInstance是生成的类型,如上所示。 我为此创建Lambda的尝试如下…… MethodInfo mi = […]

使用对象初始值设定项创建实例的表达式

有没有办法用对象初始化器和表达式树创建对象的实例? 我的意思是创建一个表达式树来构建这个lambda: // my class public class MyObject { public bool DisplayValue { get; set; } } // my lambda: var lambda = (Func) (displayValue => new MyObject { DisplayValue = displayValue }); 如何使用表达式树创建此lambda? 更新: 我试着自己编写以下代码: public static Func Creator; static void BuildLambda() { var expectedType = typeof(MyObject); var displayValueParam = Expression.Parameter(typeof(bool), “displayValue”); var ctor […]

不要在成员签名中嵌套generics类型

我已经获得了一个扩展类,它实现了以下具有违反CA1006:DoNotNestGenericTypesInMemberSignatures规则的签名的成员。 警告所涉及的代码包含在下面。 我应该如何重构代码以解决CA1006警告? 请记住,我对表达式树不是很熟悉,尽管我对匿名方法,委托和lambda非常熟悉。 任何帮助将不胜感激。 public static DataServiceQuery Expand(this DataServiceQuery source, Expression<Func> propertySelector) { string includeString = BuildString(propertySelector); return source.Expand(includeString); } private static string BuildString(Expression propertySelector) { switch (propertySelector.NodeType) { case ExpressionType.Lambda: LambdaExpression lambdaExpression = (LambdaExpression)propertySelector; return BuildString(lambdaExpression.Body); case ExpressionType.Quote: UnaryExpression unaryExpression = (UnaryExpression)propertySelector; return BuildString(unaryExpression.Operand); case ExpressionType.MemberAccess: MemberExpression memberExpression = (MemberExpression)propertySelector; MemberInfo propertyInfo = […]