C# 有没有一种方法可以让函数返回一个泛型操作,并且参数数目可变?

C# 有没有一种方法可以让函数返回一个泛型操作,并且参数数目可变?,c#,functional-programming,C#,Functional Programming,我有一个场景,在这个场景中,最好的解决方案似乎是让代码的某个区域确定可能的行为,并根据某些条件将适当的行为返回给代码的其余部分 比如: Action<int> foo = (int a) => a + 1; Action<int, string> bar = (int a, string b) => b + " : " + a; private Action GetTheRightAction(bool condition) { if (conditio

我有一个场景,在这个场景中,最好的解决方案似乎是让代码的某个区域确定可能的行为,并根据某些条件将适当的行为返回给代码的其余部分

比如:

Action<int> foo = (int a) => a + 1;
Action<int, string> bar = (int a, string b) => b + " : " + a;

private Action GetTheRightAction(bool condition)
{
  if (condition)
     return foo;
  else
    return bar;
}
动作foo=(inta)=>a+1; 动作条=(int a,string b)=>b+“:”+a; 私有操作GetTheRightAction(布尔条件) { 如果(条件) 返回foo; 其他的 返回杆; } 真正的代码显然更为复杂,
foo
bar
在行为上彼此关系更为密切。
不过,总的想法仍然存在。有没有办法让
GetTheRightAction
拥有一个通用的返回类型?

虽然我很欣赏关于这种方法潜在缺陷的评论,但我相信这是解决这个特定问题的正确方法

作为一般参考,我可以使用类似于下面所示的代码来实现这一点

public delegate void MyFunction(params object[] arguments);
MyFunction foo = (object[] arguments) => // check for arguments length and types here to direct the appropriate behaviour
MyFunc GetTheRightAction(bool condition) => // return between different MyFunc implementations as needed

没有我希望的那么干净,但它确实起到了作用。

不,你需要很多重载,尽管我猜你看得不对。如果不了解更多关于您的结构的信息,也许某种组合模式可能会完全消除对操作的需求。您如何知道如何调用此函数的结果<代码>var操作=GetTheRightAction(条件)现在怎么办?如果方法有泛型参数,它可以有泛型返回类型<代码>操作获取权限操作(布尔条件)。这意味着,当您调用
getherightaction
时,您已经知道希望它具有哪些参数。一般来说,当我们试图编写一个方法可以返回各种不同类型的代码时,我们不知道调用它时希望它返回什么类型,有点不对劲。听起来像是
GetTheRightAction
应该实际命名为
DoTheRightAction
,作为两个具体类之间接口的一部分。请注意,您正在获得否决票,因为这是一种非常糟糕的实现方式。虽然我意识到这一点,但如果否决票中也包含参数,我将不胜感激。(即,此解决方案会导致问题X、Y)。最终,我是唯一一个知道我需要解决的问题的背景的人,我不会轻率地做出架构决策。虽然C#不太适合函数式编程,但仅仅因为“我们在C#中通常是这样做的”,就坚持这一标准并创建了大量的接口/组合,这还不足以让我信服。我真正理解的是为什么这种方法不好的一些技术理由。人们评论他们的反对票时经常会遇到敌意,所以这种情况并不经常发生。我没有否决你的意见,但我想说,出于各种原因,这是一个糟糕的想法,尤其是你已经丢失了所有编译时类型检查。在函数式语言中你不应该做这样的事情,在C语言中也不应该这样做。