正在将文本框实例传递给方法组

本文关键字:方法 实例 文本 | 更新日期: 2023-09-27 18:25:40

我制作了一个方法来循环并清除表单中所有文本框控件。

Controls.OfType<TextBox>()
        .ToList()
        .ForEach(tb => tb.Clear());

这很好,但我认为,由于传递给任何实例方法的第一个参数总是对实例的引用,所以我应该能够像这样编写

Controls.OfType<TextBox>()
        .ToList()
        .ForEach(TextBox.Clear);  

不幸的是,这实际上并不奏效,我也不太明白为什么。。

正在将文本框实例传递给方法组

如果TextBox.Clear是一个带有TextBox参数的静态方法,它就会起作用;但是,它是一个没有参数的实例方法,因此编译器无法自动将其转换为Action<TextBox>

请注意,CLR确实支持开放实例委托(您可以使用Delegate.CreateDelegate方法创建一个),但C#语言不支持它。

以下是如何创建一个开放实例委托,该委托将对其参数调用TextBox.Clear

var action = (Action<TextBox>)Delegate.CreateDelegate(
    typeof(Action<TextBox>),
    null,
    typeof(TextBox).GetMethod("Clear"));

this参数是隐式的,而不是显式的。Foreach需要一个带有显式参数的方法,而不是隐式参数。

至于为什么C#语言团队没有实现这个功能,你必须问他们。当然,如果他们愿意的话,可以设计语言来支持这一点。我们猜测他们为什么不这样做是没有意义的。