我有一个功能,
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 */);
答案 0 :(得分:5)
如果功能略有变化,您可以达到预期的效果。
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" */);
注意:匿名函数只能访问公共成员。如果在类中定义了匿名函数,它将像往常一样访问受保护和私有成员。
如,
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
答案 1 :(得分:1)
否强>
嗯,是的,如果Action在这样的范围内创建,其中'this'可用并绑定在一个闭包中 - 但是透明地:否。
传递所有需要的信息或确保它在Action本身中被捕获/可用。还有其他黑客如线程本地等等。最好避免。