private void textBox1_TextChanged(object sender, EventArgs e)
{
string str = textBox1.Text.Trim();
if (!string.IsNullOrEmpty(str))
{
// Error in here
Expression<Func<CustomData, bool>> expr = n => GetCondition(n, str);
this.gridControl1.DataSource = this.lstCustomData.Where<CustomData>(expr.Compile()).ToList();
}
else
this.gridControl1.DataSource = this.lstCustomData;
this.gridControl1.RefreshDataSource();
}
public class CustomData
{
// Error in here
public int col1 { get; set; }
public string col2 { get; set; }
public string col3 { get; set; }
public int col4 { get; set; }
}
答案 0 :(得分:0)
如果我记得很好C#2.0没有lambdas和表达式。 Lambdas有一个很酷的功能 - 它们可以捕获局部变量并使用它们。如果您不能直接使用它们,则需要模仿它们的行为。 C#3.0编译器实际上如何处理lambdas?
它创建一个Closure类,其中包含要捕获的所有数据的字段,创建此类的实例,其中定义了lambda并将所有数据放入字段中。它还为类创建了一个与lambda具有相同签名的方法,并使用此方法。
这种技术可以解决您的问题,但会使您的代码更复杂一些。您需要创建一个这样的私有类:
private class WhereLambda
{
private string str;
public WhereLambda(string str)
{
this.str = str;
}
public bool IsTrue(CustomData data)
{
return GetCondition(data, this.str);
}
}
并像这样使用
WhereLambda lambda = new WhereLambda(str);
this.gridControl1.DataSource = this.lstCustomData.Where<CustomData>(lambda.IsTrue).ToList();