Expression Methods
Expression Class中
一部分方法的总结
(1)Add方法:
创建一个BinaryExpression的算法,额外不需要溢出检测.
public static BinaryExpression Add(
Expression left,
Expression right
)
(2)AddChecked方法:
创建一个BinaryExpression的算法,额外有溢出检测.
(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.
(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再去表示初始化一个新对象的两个成员.
(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)
(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}
}
{
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}
}