C# 是否可以设置;这";在匿名函数中?

C# 是否可以设置;这";在匿名函数中?,c#,anonymous-function,C#,Anonymous Function,我有一个函数 public SharpQuery Each(Action<int, HtmlNode> function) { for (int i = 0; i < _context.Count; ++i) function(i, _context[i]); return this; } 否。 好的,是的,如果操作是在这样一个范围内创建的,其中“this”是可用的,并绑定在一个闭包中——但透明地说:否 传递所有需要的信息,或确保在行动本身中捕

我有一个函数

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

好的,是的,如果操作是在这样一个范围内创建的,其中“this”是可用的,并绑定在一个闭包中——但透明地说:否


传递所有需要的信息,或确保在行动本身中捕获/可用。还有其他一些黑客,如线程局部变量等,最好避免。

只需稍微更改函数,就可以达到预期效果

public SharpQuery Each(Action<MyObject, int, HtmlNode> function)
{
    for (int i = 0; i < _context.Count; ++i)
        function(this, i, _context[i]);
    return this;
}
注意:匿名函数只能访问公共成员。如果匿名函数是在类中定义的,它将像往常一样访问受保护的和私有的成员

e、 g

类MyObject
{
公共对象(int i)
{
这个数字=i;
}
公共整数{get;private set;}
私有int NumberPlus{get{返回数+1;}}
公共无效行为(行为)
{
行动(本);
}
public void PrintNumberPlus()
{
DoAction(self=>Console.WriteLine(self.NumberPlus));//有权访问私有的`NumberPlus`
}
}
MyObject obj=新的MyObject(20);
obj.DoAction(self=>Console.WriteLine(self.Number));//好啊
obj.PrintNumberPlus();//好啊
obj.DoAction(self=>Console.WriteLine(self.NumberPlus));//错误

想要一点JavaScript进入C#?:)@混沌:我可以没有它生活。。。但我正试图尽可能地模仿某个JS库。我想你可以把它看作是一个“匿名扩展方法”。+1但OP似乎想在C#中完美地模拟jQuery。您的解决方案使
。每个
方法都不同于jQuery中的方法。无论如何,这是我能想到的最好的解决方案。实际上,我希望“this”指的是HtmlNode,而不是MyObject。它不是真的需要,因为我已经通过了。。。但我正试图从jQuery复制一些功能。我猜答案是“不”。@Mark:答案是“不”。“这个”在JS中比在C#中使用得更自由。恐怕您需要在SharpQuery规范中添加一条注释,说明匿名函数中不支持
“this”关键字。
@Mark:当然,用适当的类型替换
MyObject
,我不确定您的代码中有什么
。不幸的是,关键字
this
不能在实例上下文之外使用。即便如此,它也不能被重新分配。我认为这是在C#中最接近的方法。否则,在实例之外就没有
这个
的概念。不幸的是,您不能用与jQuery完全相同的方式来实现它,这将是一种折衷。
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