Tag: 表达

创建表达式以使用out参数调用方法

我正在尝试创建一个调用内部方法的表达式,内部方法有一个out参数,这可能吗? public class Program { static void Main(string[] args) { var type = typeof (Program); var methodInfo = type.GetMethod(“ValidateActiveControl”, BindingFlags.Instance | BindingFlags.NonPublic); var p1 = Expression.Parameter(type, “program”); var p2 = Expression.Parameter(typeof (bool), “validatedControlAllowsFocusChange”); var invokeExpression = Expression.Call(p1, methodInfo, p2); var func = (Func)Expression.Lambda(invokeExpression, p1, p2).Compile(); var validatedControlAllowsFocusChange = true; // I would expect validatedControlAllowsFocusChange to […]

从字符串属性名称创建通用表达式

我有一个名为sortColumn的变量,它包含我想要对查询结果进行排序的列的文本。 我还有一个通用存储库,它将包含我想要排序的字段的Expression作为参数。 我似乎无法从字符串属性名称获取到表达式。 所以我拥有的通用存储库包含以下方法 public IEnumerable Get(Expression<Func> criteria, Expression<Func> orderBy, int pageIndex, int pageSize, bool isAssendingOrder = true, EnumDeletePolicy deletePolicy = EnumDeletePolicy.ExcludeDeleted) 注意这个Get的第二个参数是Expression-Func-TEntity,TOrderBy。 正如我所提到的,我有一个名为sortColumn的变量,它包含我的TEntity对象上的属性的字符串,我需要将此字符串转换为可以传递给Get方法的Expression。 这就是我现在所拥有的。 var parameter = Expression.Parameter(typeof(IContract)); var memberExpression = Expression.Property(parameter, data.SortColumn); var lambdaExpression = Expression.Lambda(memberExpression, parameter); 这将创建LambdaExpression类型的对象。 此LambdaExpression的实际类型是Expression-Func-IContract,字符串(或属性的sortColumn类型)。 如果我调用Get方法并传入此LambdaExpression并将其显​​式转换为Expression类型,那么它将正常工作。 问题是我不知道Expression类型是什么,它可能是一个字符串,int,int?等等。这完全取决于sortColumn属性中特定属性的类型。 你能帮助我最后跳到正确的Expression类型吗? 根据Marc的建议编辑:我几乎有这个工作,实际上基于它正在工作的问题,但我有1个剩余的问题。 作为我要查询的实体类型的IContract实际上是从IRelationshipinheritance的。 如果我从IContract接口指定一个字段,那么上面的代码可以工作。 如果我从IRelationship接口指定一个字段,则以下行失败。 var memberExpression = Expression.Property(parameter, data.SortColumn); 如果我尝试下面这样的东西,以便从IRelationship中获取MemberExpression,但是基于IContract构建Lambda,我会从存储库中收到错误。 var […]

如何在不同(但兼容)的模型之间转换lambda表达式?

(基于电子邮件对话,现在记录用于信息共享)我有两个模型用于不同的层: public class TestDTO { public int CustomerID { get; set; } } //… public class Test { public int CustomerID { get; set; } } 和我的DTO层的lambda: Expression<Func> fc1 = (TestDTO c1) => c1.CustomerID = 10; 如何将lambda(在一般情况下)转换为讨论其他模型: Expression<Func> fc2 = {insert magic here, based on fc1} (显然,我们是在相同的测试条件之后,但是使用Test类型) ?

使用LINQ ExpressionVisitor将基本参数替换为lambda表达式中的属性引用

我正在为我们系统的一部分编写数据层,该数据层记录有关每天运行的自动作业的信息 – 作业名称,运行时间,结果,等等。 我正在使用Entity Framework与数据库交谈,但我试图将这些细节隐藏在更高级别的模块之外,我不希望实体对象本身被暴露。 但是,我想使我的界面在用于查找工作信息的标准中非常灵活。 例如,用户界面应允许用户执行复杂的查询,例如“给我所有名为’hello’的作业,该作业在上午10:00到11:00之间运行失败。” 显然,这看起来像是动态构建的Expression树的工作。 所以我希望我的数据层(存储库)能够接受类型为Expression<Func> (lambda表达式)的LINQ表达式,然后在后台转换该lambda表达式,我的Entity Framework ObjectContext可以用作Where()子句中的filter。 简而言之,我正在尝试将Expression<Func>类型的lambda表达式转换为Expression<Func> ,其中svc_JobAudit是Entity Framework数据对象,对应于存储作业信息的表。 (第一个委托中的四个参数分别对应于作业名称,运行时间,结果以及分别在MS中花费的时间) 我使用ExpressionVisitor类取得了很好的进展,直到我碰到一堵砖墙并收到带有此错误消息的InvalidOperationException : 从“VisitLambda”调用时,重写“System.Linq.Expressions.ParameterExpression”类型的节点必须返回相同类型的非null值。 或者,覆盖“VisitLambda”并将其更改为不访问此类型的子项。 我完全不知所措。 为什么它不会允许我将引用参数的表达式节点转换为引用属性的节点? 还有另一种方法可以解决这个问题吗? 以下是一些示例代码: namespace ExpressionTest { class Program { static void Main(string[] args) { Expression<Func> expression = (myString, myDateTime, myResultCode, myTimeSpan) => myResultCode == ResultCode.Failed && myString == “hello”; var result = ConvertExpression(expression); } […]

将表达式的一部分定义为c#中的变量

我有以下代码: public class MyClass { Expression<Func> Criteria {get; set;} } public class Customer { //.. public string Name {get; set;} } 并使用如下: var c = new MyClass(); c.Criteria = x.Name.StartWith(“SomeTexts”); 有没有办法定义这样的东西: ? p = x=>x.Customer.Name; var c = new MyClass(); c.Criteria = p => p.StartWith(“SomeTexts”); 我使用Expression<Func>将它用作我的linq to entities查询中的where子句(EF代码优先)。

使用表达式获取方法的名称

我知道网站上有一些答案,如果这有任何重复,我道歉,但我发现的所有答案都没有做我想做的事情。 我正在尝试指定方法信息,因此我可以通过不使用字符串以类型安全的方式获取名称。 所以我试图用表达式提取它。 假设我想在此界面中获取方法的名称: public interface IMyInteface { void DoSomething(string param1, string param2); } 目前我可以使用THIS方法获取名称: MemberInfo GetMethodInfo(Expression<Action> expression) { return ((MethodCallExpression)expression.Body).Method; } 我可以调用helper方法如下: var methodInfo = GetMethodInfo(x => x.DoSomething(null, null)); Console.WriteLine(methodInfo.Name); 但我正在寻找我可以获取方法名称而不指定参数的版本(null,null) 像这样: var methodInfo = GetMethodInfo(x => x.DoSomething); 但所有尝试都无法编译 有没有办法做到这一点?

结合两个Linq lambda表达式

Expression<Func> fn1 = x => x.PossibleSubPath.MyStringProperty; Expression<Func> fn2 = x => x.Contains(“some literal”); 有没有办法创建一个新的lambda表达式,它基本上使用fn1的输出并将其用作fn2的输入? Expression<Func> fnCombined = … 我知道我可以立即创建这个函数,但问题是我正在制作一些通用代码,因此真的需要能够分别创建这两个函数,然后将它们组合在一起,以便Linq可以使用它们我的数据库对象(entity framework)。