Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将textbox实例传递给方法组_C#_Overloading - Fatal编程技术网

C# 将textbox实例传递给方法组

C# 将textbox实例传递给方法组,c#,overloading,C#,Overloading,我创建了一个方法来循环并清除表单中的所有textbox控件 Controls.OfType<TextBox>() .ToList() .ForEach(tb => tb.Clear()); 这很好,但我认为,由于传递给任何实例方法的第一个参数始终是对实例的引用,因此我应该能够这样编写它 Controls.OfType<TextBox>() .ToList() .ForEach(TextBox.Clea

我创建了一个方法来循环并清除表单中的所有textbox控件

Controls.OfType<TextBox>()
        .ToList()
        .ForEach(tb => tb.Clear());
这很好,但我认为,由于传递给任何实例方法的第一个参数始终是对实例的引用,因此我应该能够这样编写它

Controls.OfType<TextBox>()
        .ToList()
        .ForEach(TextBox.Clear);  
不幸的是,这实际上不起作用,我也不太明白为什么

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

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

以下是如何创建将调用TextBox的开放实例委托。清除其参数:

var action = (Action<TextBox>)Delegate.CreateDelegate(
    typeof(Action<TextBox>),
    null,
    typeof(TextBox).GetMethod("Clear"));
如果TextBox.Clear是一个带有TextBox参数的静态方法,它就可以工作;但是,它是一个没有参数的实例方法,因此编译器无法自动将其转换为动作

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

以下是如何创建将调用TextBox的开放实例委托。清除其参数:

var action = (Action<TextBox>)Delegate.CreateDelegate(
    typeof(Action<TextBox>),
    null,
    typeof(TextBox).GetMethod("Clear"));
此参数是隐式的,而不是显式的。Foreach需要一个带有显式参数的方法,而不是隐式参数

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

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


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

严格来说,这是可能的。没有。没有简单的方法来引用实例方法吗?除了我做这件事的方式。。这看起来很不干净,我们正在引用ForEach中已经存在的实例,但我们不能只写ForEachClear..@OverlyExcessive您可以创建一个调用实例方法的静态方法。这当然就是匿名方法为您所做的;如果您愿意,您可以简单地给它起个名字。@thomasleveque感谢您提供了一个详细的示例,说明我们如何使用Delegate.CreateDelegate来完成此任务。尽管在这种情况下,我认为创建一个新的委托并为此目的使用反射是过分的。然而,我学到了一些新的东西。@OverlyExcessive,是的,在这种情况下,它可能会过度;严格地说,它可以。没有。没有简单的方法来引用实例方法吗?除了我做这件事的方式。。这看起来很不干净,我们正在引用ForEach中已经存在的实例,但我们不能只写ForEachClear..@OverlyExcessive您可以创建一个调用实例方法的静态方法。这当然就是匿名方法为您所做的;如果您愿意,您可以简单地给它起个名字。@thomasleveque感谢您提供了一个详细的示例,说明我们如何使用Delegate.CreateDelegate来完成此任务。尽管在这种情况下,我认为创建一个新的委托并为此目的使用反射是过分的。然而,我学到了一些新的东西。@OverlyExcessive,是的,在这种情况下,它可能会过度@你期望实现一个C语言团队没有实现的特性。它总是发生;人们期望每种语言都有它所没有的功能。这是作为一名程序员你不得不面对的事情。@OverlyExcessive你期望实现一个C语言团队没有实现的功能。它总是发生;人们期望每种语言都有它所没有的功能。作为一名程序员,这是你不得不忍受的。