存储指向方法参数的指针以供以后重用

Rob*_*nik 5 c# lambda pointers

类似于带有自由变量的lambda表达式如何工作,我想实现我自己的闭包类,它捕获一些方法参数.

public class Closure<TObject, TVariable>
{
    public TVariable Variable { get; set; }
    public Func<TObject, bool> Predicate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一些适用于DateTime实例的类.应该使用此闭包类的方法之一是:

// Original Version
public IEnumerable<Item> GetDayData(DateTime day)
{
    this.items.Where(i => i.IsValidForDay(day));
}
Run Code Online (Sandbox Code Playgroud)

我想将它转换为使用Closure类.问题是我想重用(性能原因)我的Closure类实例:

private Closure<Item, DateTime> closure = null;
public IEnumerable<Item> GetDayData(DateTime day)
{
    if (closure == null)
    {
        this.closure = new Closure<Item, DateTime>() {
            Variable = reference of "day" param, <=== HOW ????????
            Predicate = i => i.IsValidForDay(this.closure.Variable)
        }
    }
    this.items.Where(this.closure.Predicate);
}
Run Code Online (Sandbox Code Playgroud)

为了让我重用相同的Closure实例,我不得不存储参数的值(进入closure的Variable字段),而是存储方法参数的引用指针.所以下次这个方法被称为闭包时Variable,实际上会指向要使用的正确值.

我该怎么

当编译器生成捕获lambda表达式自由变量的类时,也会发生类似的事情.我一直在看反编译代码(使用Reflector),但我似乎不明白这是怎么做的......

lep*_*pie 0

你的例子有点错误(这也可能行不通,但语义/意图是正确的):

private Closure<Item, DateTime> closure = null;
public IEnumerable<Item> GetDayData(DateTime day)
{
    if (closure == null)
    {
        this.closure = new Closure<Item, DateTime>() {
            Predicate = i => i.IsValidForDay(this.closure.Variable)
        }
    }
    // assign here, else you only capture it the first time
    closure.Variable = day;
    this.items.Where(this.closure.Predicate);
}
Run Code Online (Sandbox Code Playgroud)