将代码C#2008转换为代码C#2005?

时间:2015-03-03 07:09:47

标签: c#-2.0

我希望将C#2008转换为代码C#2005,我不明白命令C#2008切换到C#2005,看下面是错误代码可以解决错误命令吗?在C#2008中运行代码非常好

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; }
}

1 个答案:

答案 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();