c# - 是否可以在匿名函数中设置 "this"?

标签 c# anonymous-function

我有一个函数,

public SharpQuery Each(Action<int, HtmlNode> function)
{
    for (int i = 0; i < _context.Count; ++i)
        function(i, _context[i]);
    return this;
}

它为上下文的每个元素调用传入的函数。是否可以在 Action<int, HtmlNode> function 中设置“this”所指的内容? ?

例如,

sharpQuery.Each((i, node) => /* `this` refers to an HtmlNode here */);

最佳答案

稍微改变一下功能,就可以达到想要的效果。

public SharpQuery Each(Action<MyObject, int, HtmlNode> function)
{
    for (int i = 0; i < _context.Count; ++i)
        function(this, i, _context[i]);
    return this;
}

然后你可以这样写你的函数调用:

sharpQuery.Each((self, i, node) => /* do something with `self` which is "this" */);

注意:匿名函数只能访问公共(public)成员。如果匿名函数是在类中定义的,它将像往常一样访问 protected 和私有(private)成员。

例如,

class MyObject
{
    public MyObject(int i)
    {
        this.Number = i;
    }

    public int Number { get; private set; }
    private int NumberPlus { get { return Number + 1; } }

    public void DoAction(Action<MyObject> action)
    {
        action(this);
    }

    public void PrintNumberPlus()
    {
        DoAction(self => Console.WriteLine(self.NumberPlus));  // has access to private `NumberPlus`
    }
}

MyObject obj = new MyObject(20);
obj.DoAction(self => Console.WriteLine(self.Number));     // ok
obj.PrintNumberPlus();                                    // ok
obj.DoAction(self => Console.WriteLine(self.NumberPlus)); // error

关于c# - 是否可以在匿名函数中设置 "this"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4093642/

相关文章:

javascript - 在 JavaScript 中,当循环通过 FOR 循环时,如何将数组中项的值传递给匿名函数?

javascript - 如何将匿名函数内的变量导出到 JavaScript 的全局范围?

c# - 验证方法访问权限的最优雅方法是什么 (C#.Net)

c# - 构造 linq 查询

c# - 为什么 OpenFileDialog 会在特定机器上卡住 WinForms 应用程序?

javascript - 如何在不使用 Eval 的情况下调用匿名函数?

c# - 继承 : does not contain a definition for and no extension method accepting a first argument

c# - 如果抛出异常, "fixed"是否得到正确清理?

java - java中的匿名函数

javascript - ExtJS监听器: anonymous function parameters