Jan*_*i5e 7 linq lambda static-methods expression-trees c#-4.0
我正在尝试创建一个表达式树.我需要从数据表中读取数据并检查其列.要检查的列以及要检查的列数仅在运行时已知.列名作为字符串数组提供给我,每列都有一个要检查的字符串列表.我尝试了样本表达式树,如下所示.
我遇到了一个错误.
静态方法需要null实例,非静态方法需要非null实例.参数名称:实例
在线
inner = Expression.Call(rowexp,mi,colexp);
请帮助我!!!
IQueryable<DataRow> queryableData = CapacityTable
.AsEnumerable()
.AsQueryable()
.Where(row2 => values.Contains(row2.Field<string>("Head1").ToString())
&& values.Contains(row2.Field<string>("Head2").ToString()));
MethodInfo mi = typeof(DataRowExtensions).GetMethod(
"Field",
new Type[] { typeof(DataRow),typeof(string) });
mi = mi.MakeGenericMethod(typeof(string));
ParameterExpression rowexp = Expression.Parameter(typeof(DataRow), "row");
ParameterExpression valuesexp = Expression.Parameter(typeof(List<string>), "values");
ParameterExpression fexp = Expression.Parameter(typeof(List<string>), "types");
Expression inner, outer, predicateBody = null;
foreach (var col in types)
{
// DataRow row = CapacityTable.Rows[1];
ParameterExpression colexp = Expression.Parameter(typeof(string), "col");
// Expression left = Expression.Call(pe, typeof(string).GetMethod("ToLower", System.Type.EmptyTypes));
inner = Expression.Call(rowexp,mi, colexp);
outer = Expression.Call(valuesexp, typeof(List<string>).GetMethod("Contains"), inner);
predicateBody = Expression.And(predicateBody,outer);
}
MethodCallExpression whereCallExpression = Expression.Call(
typeof(Queryable),
"Where",
new Type[] { queryableData.ElementType },
queryableData.Expression,
Expression.Lambda<Func<DataRow,bool>>(predicateBody, new ParameterExpression[] { rowexp }));
Run Code Online (Sandbox Code Playgroud)
这意味着你试图表示的方法调用是静态的,但是你给它一个目标表达式.这就像打电话:
Thread t = new Thread(...);
// Invalid!
t.Sleep(1000);
Run Code Online (Sandbox Code Playgroud)
你试图在表达式树形式中尝试这样做,这也是不允许的.
看起来Field扩展方法就是DataRowExtensions这样 - 所以扩展方法的"目标"需要表示为调用的第一个参数,因为你实际上想要调用:
DataRowExtensions.Field<T>(row, col);
Run Code Online (Sandbox Code Playgroud)
所以你要:
inner = Expression.Call(mi, rowexp, colexp);
Run Code Online (Sandbox Code Playgroud)
这将调用此重载,这是使用两个参数调用静态方法的方法.
| 归档时间: |
|
| 查看次数: |
6239 次 |
| 最近记录: |