C# 无法从';方法组';至';系统行动<;对象>';错误
我创建了以下函数:C# 无法从';方法组';至';系统行动<;对象>';错误,c#,generics,delegates,method-group,C#,Generics,Delegates,Method Group,我创建了以下函数: public void DelegatedCall(Action<Object> delegatedMethod) 但是,当我尝试使用foo1调用DelegateCall时: DelegatedCall(foo1); …我得到以下编译器错误: 参数1:无法从“方法组”转换为“系统操作” 此错误的原因是什么?如何更正?不幸的是,将foo1转换为Action不是一个选项 方差不是这样工作的;你需要 DelegatedCall(obj => foo1((str
public void DelegatedCall(Action<Object> delegatedMethod)
但是,当我尝试使用foo1
调用DelegateCall
时:
DelegatedCall(foo1);
…我得到以下编译器错误:
参数1:无法从“方法组”转换为“系统操作”
此错误的原因是什么?如何更正?不幸的是,将
foo1
转换为Action
不是一个选项 方差不是这样工作的;你需要
DelegatedCall(obj => foo1((string)obj));
即使在4.0中,它也不会相信每个对象都是字符串
请注意,如果它是
foo1(object)
和Action
(即相反的方式),它可能会工作(在4.0中),因为每个字符串都是一个对象。DelegatedCall
需要一个将任何对象作为参数的委托。但是传递给DelegatedCall
的函数foo1
只能处理字符串
参数。因此,转换不是类型安全的,因此是不可能的
输入参数为,但您的代码需要。(见附件。)
您可以将DelegatedCall
设置为通用:
DelegatedCall<T>(Action<T> action)
但实现它是丑陋的,需要反思。它也不会验证函数在编译时是否只有一个参数。另一种方法甚至在4.0之前也适用。当从方法组转换时,即使在早期版本中也可以使用差异。确定是否有其他方法,我可以做到这一点:我希望DelegateCall能够接收接收任何类型(字符串、布尔、列表…)的任何一个参数的函数。如果有任何帮助,我们将不胜感激。您知道我可以用什么方法创建这样的代码吗?我希望DelegateCall能够接收一个函数,该函数可以接收任何类型的任何一个参数(字符串、bool、List…),您可以在任何阅读材料上推荐如何使用反射来实现第二个选项吗?相关:
DelegatedCall<T>(Action<T> action)
DelegatedCall(Delegate action)