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 {get; set;} public int Age {get; set;}}
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