由于程序中需要通过反射调用Dal中的public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda)等方法,其中需要传递参数。
string propertyName = propertyInfoes[0].Name;
LambdaExpression exp = Common.LambdaHelper.CreateEqual(ModelType, propertyName, propertyValue);//生成Lambda参数,是个LambdaExpression类型的表达式。
object[] parametersLoad = new object[] { exp };//将表达式加入参数列表
MethodInfo MethodInfo = DalType.GetMethod("LoadEntity");
var resultInstanceModele = MethodInfo.Invoke(DalInstance, parametersLoad);
在网络上找到一个lambdaHelper基础上,增加了参数Type T的传送,用于动态创建的lambda表达式用于反射动态创建的对象方式时传递方法参数。在反射机制调用时,需要传递Lambda表达式作为参数,而且在调用该类产生Lambda表达式时只知道类型T的Type,例如知道 Type T=typeof(string)中的T,而没有string类型。
/// <summary>
/// 2017-09-03 DrXue:在原有lambdaHelper基础上,增加了参数Type T的传送,用于动态创建的lambda表达式用于反射动态创建的对象方式时传递方法参数。在反射机制调用时,需要传递Lambda表达式作为参数,而且在调用该类产生Lambda表达式时只知道类型T的Type,例如知道 Type T=typeof(string)中的T,而没有string类型。
/// </summary>
public class LambdaHelper
{
/// <summary>
/// 创建lambda表达式:p=>true
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> True<T>()
{
return p => true;
}
/// <summary>
/// 创建lambda表达式:p=>true
/// </summary>
/// <param name="T"></param>
/// <returns></returns>
public static Expression True(Type T)
{
ParameterExpression parameter = Expression.Parameter(T, "p");
return Expression.Lambda(Expression.Constant(true), parameter);
}
/// <summary>
/// 创建lambda表达式:p=>false
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> False<T>()
{
return p => false;
}
/// <summary>
/// 创建lambda表达式:p=>false
/// </summary>
/// <param name="T"></param>
/// <returns></returns>
public static Expression False(Type T)
{
ParameterExpression parameter = Expression.Parameter(T, "p");
return Expression.Lambda(Expression.Constant(false), parameter);
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TKey"></typeparam>
/// <param name="sort"></param>
/// <returns></returns>
public static Expression<Func<T, TKey>> GetOrderExpression<T, TKey>(string propertyName)
{
ParameterExpression parameter = Expression.Parameter(typeof(T), "p");
return Expression.Lambda<Func<T, TKey>>(Expression.Property(parameter, propertyName), parameter);
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName
/// </summary>
/// <param name="T"></param>
/// <param name="propertyName"></param>
/// <returns></returns>
public sta