Expression Methods

mac2022-06-30  10

Expression Class中 一部分方法的总结
(1)Add方法:
创建一个BinaryExpression的算法,额外不需要溢出检测. public static BinaryExpression Add(     Expression left,     Expression right )
(2)AddChecked方法:
创建一个BinaryExpression的算法,额外有溢出检测. public static BinaryExpression AddChecked( Expression left, Expression right )
(3)Bind 方法
创建一个MemberAssignment呈现一个域或属性的初始化. public static MemberAssignment Bind(     MemberInfo member,     Expression expression )
(3)Call Method
调用一个MethodCallExpression. public static MethodCallExpression Call(     Expression instance,     MethodInfo method )
(4)Constant Method
创建一个有Value属性值的ConstantExpression. public static ConstantExpression Constant(     Object value )
(5)Convert Method
创建一个UnaryExpression. public static UnaryExpression Convert(     Expression expression,     Type type )
(6)ElementInit方法
创建一个ElementInit.给第二个参数为IEnumerable(T) public static ElementInit ElementInit(     MethodInfo addMethod,     IEnumerable<Expression> arguments )
(7)GetActionType
创建一个Type对象表示一个泛性的System.Action委托的类型 public static Type GetActionType(     params Type[] typeArgs )
(8)GetFuncType方法
创建一个Type对象呈现一个泛性的System.Func委托的类型. public static Type GetFuncType(     params Type[] typeArgs )
(9)GreaterThan
创建一个表示与被比较数字更大的BinaryExpression.
(10)Invoke Method
创建一个InvocationExpression. public static InvocationExpression Invoke(     Expression expression,     IEnumerable<Expression> arguments ) 返回值 类型为System.Linq.Expressions.InvocationExpression; 一个已经有NodeType属性等于Invoke 和Expression和Arguments属性的值的InvocationExpression. 注意: InvocationExpression最终结果的Type属性表示返回委托的类型是expression.Type; 如果arguments是Null,InvocationExpression最终结果Arguments属性是空.其他情况,它包括同一个元素的arguments以外的Expression objects被引用. 下面事例是使用Invoke(Expression,Expression[])方法创建一个InvocationExpression表示指定了arguments的lambda expression的invocation. System.Linq.Expressions.Expression < Func < int int bool >>  largeSumTest  =     (num1, num2)  =>  (num1  +  num2)  >   1000 ; //  Create an InvocationExpression that represents applying //  the arguments '539' and '281' to the lambda expression 'largeSumTest'. System.Linq.Expressions.InvocationExpression invocationExpression  =     System.Linq.Expressions.Expression.Invoke(        largeSumTest,        System.Linq.Expressions.Expression.Constant( 539 ),        System.Linq.Expressions.Expression.Constant( 281 ));Console.WriteLine(invocationExpression.ToString()); //  This code produces the following output: // //  Invoke((num1, num2) => ((num1 + num2) > 1000),539,281)  
(11)Expression.Lambda(TDelegate) Generic Method (Expression, IEnumerable(ParameterExpression))
创建一个Expression(TDelegate),在编译时委托类型就能被知道. public static Expression<TDelegate> Lambda<TDelegate>(     Expression body,     IEnumerable<ParameterExpression> parameters ) 类型参数: TDelegate:委托类型; 参数: body:类型为System.Linq.Expressions.Expression.与Expression类中设置的Body属性相等. parameters:类型为System.Collections.Generic.IEnumerable(ParameterExpression) 一个IEnumerable(T)包括使用Parameters集合中的ParameterExpression对象. 返回值: 类型为System.Linq.Expressions.Expression(TDelegate) 返回一个有的NodeType属性等于Lambda和Body和Parameters属性的值的Expression(TDelegate). 注意: 委托类型TDelegate的参数的个数等于元素参数的个数. 这里的参数的元素必须参考在body中的parameter expressions. 最终结果对象的类型属性表示类型为TDelegate.如果参数是null,最终结果对象参数属性是一个空(empty)集合.
(12)MakeUnary Method
创建一个UnaryExpression,给一个操作数,调用相应的factory method. public static UnaryExpression MakeUnary(     ExpressionType unaryType,     Expression operand,     Type type )
(13)MemberInit Method
创建一个MemberInitExpression. public static MemberInitExpression MemberInit(     NewExpression newExpression,     IEnumerable<MemberBinding> bindings ) 返回值: 类型为:System.Linq.Expressions.MemberInitExpression 一个已经有NodeType属性等于MemberInit 和NewExpression和Bindings属性的值的MemberInitExpression. 注意: MemberInitExpression的最终结果的Type属性等于newExpression属性的类型. 事例: 下面事例怎样使用MemberInit(NewExpression, array<MemberBinding>[])方法去创建一个MemberInitExpression再去表示初始化一个新对象的两个成员. class  Animal {    public string Species {getset;}    public int Age {getset;}} public   static   void  CreateMemberInitExpression() {    System.Linq.Expressions.NewExpression newAnimal =        System.Linq.Expressions.Expression.New(typeof(Animal));    System.Reflection.MemberInfo speciesMember =        typeof(Animal).GetMember("Species")[0];    System.Reflection.MemberInfo ageMember =        typeof(Animal).GetMember("Age")[0];    // Create a MemberBinding object for each member    // that you want to initialize.    System.Linq.Expressions.MemberBinding speciesMemberBinding =        System.Linq.Expressions.Expression.Bind(            speciesMember,            System.Linq.Expressions.Expression.Constant("horse"));    System.Linq.Expressions.MemberBinding ageMemberBinding =        System.Linq.Expressions.Expression.Bind(            ageMember,            System.Linq.Expressions.Expression.Constant(12));    // Create a MemberInitExpression that represents initializing    // two members of the 'Animal' class.    System.Linq.Expressions.MemberInitExpression memberInitExpression =        System.Linq.Expressions.Expression.MemberInit(            newAnimal,            speciesMemberBinding,            ageMemberBinding);    Console.WriteLine(memberInitExpression.ToString());    // This code produces the following output:    //    // new Animal() {Species = "horse", Age = 12}}

转载于:https://www.cnblogs.com/worksguo/archive/2008/03/28/1127573.html

最新回复(0)