Tag: 表达式树

如何更改表达式树中的类型?

我有这样的方法: private bool Method_1(Expression<Func> expression) { /* Some code that will call Method_2 */ } 在这个方法中,我想将IPerson类型更改为另一种类型。 我想调用另一个看起来像这样的方法: private bool Method_2(Expression<Func> expression) { /* Some code */ } 所以,在method_1我需要将IPerson更改为PersonData 。 我怎样才能做到这一点? 编辑: 当我调用时: Method_1(p => p.Id == 1)我想’保存’条件( p.Id == 1 )但是我想在另一种类型上执行这个条件,即IPerson 。 所以,我需要改变表达式或用IPerson创建一个新的表达式 编辑二: 对于那些感兴趣的人,这是(现在)我的解决方案: private class CustomExpressionVisitor : ExpressionVisitor { ParameterExpression _parameter; public CustomExpressionVisitor(ParameterExpression […]

如何使用表达式树安全地访问可空对象的路径?

当我将反序列化的XML结果导入到xsd生成的对象树中并希望在该树abcdef中使用一些深层对象时,如果缺少该查询路径上的任何节点,它将给出exception。 if(abcdef != null) Console.Write(“ok”); 我想避免为每个级别检查null,如下所示: if(a != null) if(ab != null) if(abc != null) if(abcd != null) if(abcde != null) if(abcdef != null) Console.Write(“ok”); 第一个解决方案是实现Get扩展方法,该方法允许: if(a.Get(o=>ob).Get(o=>oc).Get(o=>od).Get(o=>oe).Get(o=>of) != null) Console.Write(“ok”); 第二个解决方案是实现Get(string)扩展方法并使用reflection来获得如下所示的结果: if(a.Get(“bcdef”) != null) Console.Write(“ok”); 第三种解决方案,可以是实现ExpandoObject并使用动态类型来获得如下所示的结果: dynamic da = new SafeExpando(a); if(da.bcdef != null) Console.Write(“ok”); 但是最后2个解决方案并没有带来强类型和智能感知的好处。 我认为最好的可能是可以用Expression Trees实现的第四个解决方案: if(Get(abcdef) != null) Console.Write(“ok”); 要么 if(a.Get(a=>abcdef) != […]

结合Lambda表达式

我正在寻找一种方法来组合两个lambda表达式,而不在任何一个Expression.Invoke上使用Expression.Invoke 。 我想基本上构建一个链接两个独立的表达式的新表达式。 请考虑以下代码: class Model { public SubModel SubModel { get; set;} } class SubModel { public Foo Foo { get; set; } } class Foo { public Bar Bar { get; set; } } class Bar { public string Value { get; set; } } 我可以说我有两个表达方式: Expression<Func> expression1 = m => m.SubModel.Foo; Expression<Func> […]

有一种简单的方法可以将(lambda表达式)字符串解析为Action委托吗?

我有一个方法,根据传递给它的动作委托改变“帐户”对象: public static void AlterAccount(string AccountID, Action AccountAction) { Account someAccount = accountRepository.GetAccount(AccountID); AccountAction.Invoke(someAccount); someAccount.Save(); } 这按预期工作…… AlterAccount(“Account1234”, a => a.Enabled = false); …但是现在我想尝试做的是这样的方法: public static void AlterAccount(string AccountID, string AccountActionText) { Account someAccount = accountRepository.GetAccount(AccountID); Action AccountAction = MagicLibrary.ConvertMagically<Action>(AccountActionText); AccountAction.Invoke(someAccount); someAccount.Save(); } 它可以像以下一样使用: AlterAccount(“Account1234”, “a => a.Enabled = false”); 禁用帐户“Account1234”。 我已经看过linq动态查询库 ,它似乎或多或少地做了我想要的但是对于Func类型的委托,我对表达式树等的了解还不够好,无法弄清楚如何实现我的目标想。 有没有一种简单的方法可以做我想要的,或者我是否需要正确学习表达式并编写大量代码? (我想这样做的原因是允许从powershell脚本中批量更新帐户对象的简单方法,其中用户可以指定lambda表达式来执行更改。)

替换表达式正文中的参数名称

我正在尝试基于Specification对象动态构建表达式。 我创建了一个ExpressionHelper类,它有一个私有的表达式,如下所示: private Expression<Func> expression; public ExpressionHelper() { expression = (Expression<Func>)(a => true); } 然后一些简单的方法如下: public void And(Expression<Func> exp); 我正在和And方法的身体挣扎。 我基本上想要从exp删除主体,将所有参数替换为expression的参数,然后将其附加到expression主体的末尾和AndAlso。 我做到了这个: var newBody = Expression.And(expression.Body,exp.Body); expression = expression.Update(newBody, expression.Parameters); 但最终我的表达看起来像这样: { a => e.IsActive && e.IsManaged } 有更简单的方法吗? 或者我怎样才能撕掉那些e并用一个替换它们?

如何将一种类型的表达式树转换为不同的表达式类型?

如果我有两个几乎相同的类Animal和AnimalViewModel以及一个与viewmodel相关的表达式树,我该如何将它翻译成Animal ? public class Animal { public string Species { get; set; } public string Name { get; set; } public string Sound { get; set; } } public class AnimalViewModel : ViewModelBase { public string Species { get; set; } public string Name { get; set; } public string Sound { get; set; } […]

c#将字符串表达式转换为布尔表达式

是否可以将字符串表达式转换为布尔条件? 例如,我得到以下字符串: var b = “32 20” 我想创建一个bool表达式并调用它。 字符串表示也很灵活(使其更有趣),因此它允许||, &&, () 。

如何设置值属性选择器Expression <Func >

我需要使用模式工厂的想法将我的Person类实体中的实体属性Address与我的FactoryEntities类中的表达式linq相关联,看看这就是我拥有的和我想做的事情: Address address = new Address(); address.Country = “Chile”; address.City = “Santiago”; address.ZipCode = “43532”; //Factory instance creation object //This is idea Person person = new FactoryEntity().AssociateWithEntity(p=>p.Address, address); public class Person: Entity { public string Name{ get; set; } public string LastName{ get; set; } public Address Address{ get; set; } } public class Address: […]

C#LINQ to SQL:重构此通用GetByID方法

我写了以下方法。 public T GetByID(int id) { var dbcontext = DB; var table = dbcontext.GetTable(); return table.ToList().SingleOrDefault(e => Convert.ToInt16(e.GetType().GetProperties().First().GetValue(e, null)) == id); } 基本上它是Generic类中的一个方法,其中T是DataContext中的一个类。 该方法从T( GetTable )的类型获取表,并检查输入参数的第一个属性(始终是ID)。 这个问题是我必须首先将元素表转换为列表以在属性上执行GetType ,但这不是很方便,因为必须枚举表的所有元素并将其转换为List 。 如何重构此方法以避免整个表上的ToList ? [更新] 我无法直接在表上执行Where的原因是因为我收到此exception: 方法’System.Reflection.PropertyInfo [] GetProperties()’没有支持的SQL转换。 因为GetProperties无法转换为SQL。 [更新] 有人建议使用T的接口,但问题是T参数将是[DataContextName] .designer.cs中自动生成的类,因此我无法使其实现接口(并且它不可行实现LINQ的所有这些“数据库类”的接口;并且,一旦我将新表添加到DataContext,该文件将被重新生成,从而丢失所有写入的数据)。 所以,必须有一个更好的方法来做到这一点…… [更新] 我现在已经按照Neil Williams的建议实现了我的代码,但我仍然遇到问题。 以下是代码的摘录: 接口: public interface IHasID { int ID { get; set; […]