正在将文本框实例传递给方法组
本文关键字:方法 实例 文本 | 更新日期: 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#语言团队没有实现这个功能,你必须问他们。当然,如果他们愿意的话,可以设计语言来支持这一点。我们猜测他们为什么不这样做是没有意义的。