Tag: lambda

Lambda的属性构造函数

可以这样做: public static void SomeMethod(Expression expr) { //LambdaExpression happily excepts any Expession LambdaExpression lamb = expr; } 并在其他地方调用它传递参数的lambda: SomeMethod<Func<IQueryable,Person>>( p=>p.FirstOrDefault()); 我想改为将表达式作为参数传递给属性构造函数 。 可以这样做吗? class ExpandableQueryAttribute: Attribute { private LambdaExpression someLambda; //ctor public ExpandableQueryMethodAttribute(LambdaExpression expression) { someLambda = expression } } //usage: static LambdaExpression exp = (Expression<Func<IQueryable, Person>>) (p => p.FirstOrDefault()); [ExpandableQueryAttribute(exp)] //error here // “An […]

C#方法属性不能包含Lambda表达式?

IntelliSense告诉我“Expression不能包含匿名方法或lambda表达式”。 真? 我不知道这个强加的限制。 它是否正确? 我想我正在寻找一个健全检查…… public delegate bool Bar(string s); [AttributeUsage(AttributeTargets.All)] public class Foo : Attribute { public readonly Bar bar; public Foo(Bar bar) { this.bar = bar; } } public class Usage { [Foo(b => b == “Hello World!”)] // IntelliSense Complains here public Usage() { } }

表达式树复制或转换

如何转换表单的ExpressionTree Expression<Func> exp = p => p.Age > 50; 至 Expression<Func> exp2 = p => p.Age > 50; 其中POCO1和POCO2是C#对象,并且都具有Int32 Age属性

在非原始/非结构对象上检查null之后,“可空对象必须具有值”exception

我得到Nullable object must have a value after checking for null在常规对象上进行null检查后返回值。 我发现了各种各样的问题,主要是关于linq-to-sql,有相同的问题,但总是有可空的原始类型(如bool?或DateTime? )。 在我的情况下导致exception的行看起来像这样: myDataContext.Orders.Where(y => customer.Address == null || (string.IsNullOrEmpty(customer.Address.Street) || y.Customers.Addresses.Street == customer.Address.Street))) customer类看起来像这样: public class Customer { private Address address = null; public Address Address{get{return address;} set{address=value;}} } address属性如下所示: public class Address { private string street = null; public string Street{get{return street ;} […]

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

当我将反序列化的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) != […]

C#lambda,当你想到的时候没有采用局部变量值?

鉴于: void AFunction() { foreach(AClass i in AClassCollection) { listOfLambdaFunctions.AddLast( () => { PrintLine(i.name); } ); } } void Main() { AFunction(); foreach( var i in listOfLambdaFunctions) i(); } 现在你会认为这样做会对等: void Main() { foreach(AClass i in AClassCollection) PrintLine(i.name); } 但事实并非如此,它每次都会打印出AClassCollection中最后一项的名称! 所以基本上每个lambda函数都使用相同的项目。 我怀疑“当lambda被创建时”或“当它使用其中使用的外部变量的快照时”可能有一些延迟,或者基本上,只是持有’对局部变量的引用’i’ 所以我这样做了: string astr = “a string”; AFunc fnc = () => { System.Diagnostics.Debug.WriteLine(astr); […]

通用扩展方法:无法从用法推断出类型参数

我正在尝试创建一个适用于类型化数据表的通用扩展方法: public static class Extensions { public static TableType DoSomething(this TableType table, param Expression<Func>[] predicates) where TableType : TypedTableBase where RowType : DataRow { // do something to each row of the table where the row matches the predicates return table; } [STAThread] public static void main() { MyTypedDataSet.MyTypedDataTable table = getDefaultTable(); } public static […]

声明Func 动态

考虑一下: var propertyinfo = typeof(Customer).GetProperty(sortExpressionStr); Type orderType = propertyinfo.PropertyType; 现在我想宣布 Func 我知道它不可能直接因为ordertype是在运行时但有任何解决方法吗? 这正是我想要做的: var propertyinfo = typeof(T).GetProperty(sortExpressionStr); Type orderType = propertyinfo.PropertyType; var param = Expression.Parameter(typeof(T), “x”); var sortExpression = (Expression.Lambda<Func> (Expression.Convert(Expression.Property(param, sortExpressionStr), typeof(orderType)), param)); 这一切都是因为我想转换: Expression<Func> to Expression<Func> 或者如果它不可能那么我想从正确的类型的第一个地方创建它,案例如下: 我在一个方法里面有一个type(Customer)和一个我希望按其订购的类型的属性名称,我想创建一个排序表达式树来将它传递给Orderby (这里)。

获取.NET 3.5中的Lambda表达式中使用的属性名称

我有一个问题一直唠叨我一段时间,我找不到答案。 我需要获取Lambda表达式中引用的属性的名称。 我会将lambda表达式提供给一个返回字符串的方法。 例如,如果我有: x => x.WeirdPropertyName 然后该方法将返回: “WeirdPropertyName” 我已经读过它可以用表达式树来完成,但答案已经没有了。 谢谢你的帮助

使用reflection从属性Name获取lambda表达式

我想让用户选择不同属性的搜索。 例如 [输入文本] | [选择选项{ID,NAME,PHONE}] | [搜索] 然后我会像这样构建我的查询: repository.Where(lambda-expression) 从所选选项{ID,NAME,PHONE}构建lambda表达式(例如:x => x.NAME.Equals(INPUT TEXT)) 有没有办法从Property属性名称构建lambda,也许使用reflection? 谢谢