Expression Methods

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}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值