如何创建匿名函数列表/与会代表C#

问题描述:

我有像这样如何创建匿名函数列表/与会代表C#

 private List<Func<int, double, char, string, string>> FuncList; 

列表对象,并一直在试图将项目添加到使用委托和匿名函数此列表。问题是,当我尝试创建具有此类型的函数时,我必须从该函数返回一个函数。我设法以递归的方式做到这一点,但是这将它引入无限循环。有没有可能在这个列表中添加函数,如果是这样的话?

我试图添加传递到委托像这样

public delegate Func<int, double, char, string, string> funcDelegate(someFunc); 

函数,然后你会怎么写someFunc像这样

FuncList.add(funcDelegate); 

因此,该代码会工作。

我在编写返回正确类型的函数时失败的尝试就像这样,因为它是递归的而没有停止的情况下不起作用。

public Func<int, double, char, string, string> SomeFunc(int i, double d, char c, string s1, string s2) 
    { 
     Console.WriteLine($"{i}\n{d}\n{c}\n{s1}\n{s2}"); 
     return this.SomeFunc(i,d,c,s1,s2); 
    } 
+2

你的问题还不清楚。请添加更多代码。 –

+0

C#中没有匿名函数/代表。 –

首先,您的方法没有正确的签名。 Func<>中的最后一个通用参数是返回类型。 Action<>是一个返回void的泛型委托类型。

其次,使用Func<>的整点是你不需要创建新类型的代表 - Func<>已经是一个委托。

下面是一个例子:

// A list of delegates that accept an integer and return a string 
    private static List<Func<int, string>> delegateList = new List<Func<int, string>>(); 

    public static string Foo(int x) 
    { 
     return $"Foo {x}"; 
    } 

    public static void Test() 
    { 
     delegateList.Add(Foo); // Add a delegate to a named method 
     delegateList.Add(delegate(int x) { return $"Bar {x * 2}"; }); // Add a delegate to an anonymous method 
     delegateList.Add(x => $"Baz {x * 3}"); // Add a delegate to a lambda 
     foreach (var del in delegateList) 
     { 
      Console.WriteLine(del(23)); 
     } 
    } 

在你的榜样,你声明一个委托到返回另一个代表一个功能,但似乎并没有被你想要完成的任务。

+0

非常感谢!这有助于明确我做错了什么。 – Giovanni

这里是我的两个美分的价值 - 它可以处理多达4个输入参数的任意委托,但可以扩展...

public class so40645583 
{ 
    private IList<Delegate> FuncList = new List<Delegate>(); 

    public void Add<InputType, OutputType>(Func<InputType, OutputType> func) 
    { 
     FuncList.Add(func); 
    } 

    public void Add<InT1, InT2, OutputType>(Func<InT1, InT2, OutputType> func) 
    { 
     FuncList.Add(func); 
    } 

    public void Add<InT1, InT2, InT3, OutputType>(Func<InT1, InT2, InT3, OutputType> func) 
    { 
     FuncList.Add(func); 
    } 

    public void Add<InT1, InT2, InT3, InT4, OutputType>(Func<InT1, InT2, InT3, InT4, OutputType> func) 
    { 
     FuncList.Add(func); 
    } 

    // This won't work as it is trying to return a delegate type 
    // public static Func<int, double, char, string, string> SomeFunc(int i, double d, char c, string s1) 

    public static string SomeFunc(int i, double d, char c, string s1) 
    { 
     return String.Format("{0} {1} {2} {3}", i, d, c, s1); 
    } 

    public static string SomeFunc2(int i) 
    { 
     return i.ToString(); 
    } 

    public void Test() 
    { 
     Add<int, double, char, string, string>(SomeFunc); 
     Add<int, string>(SomeFunc2); 

     // Try invoking via list 
     Delegate d = FuncList[0]; 
     string s = (string)d.DynamicInvoke(2, 2.0, 'c', "Hi"); 
     Console.WriteLine(s); 
     // Invoke directly 
     s = SomeFunc(2, 2.0, 'c', "Hi"); 
     Console.WriteLine(s); 
     // Now the second one 
     d = FuncList[1]; 
     s = (string)d.DynamicInvoke(5); 
     Console.WriteLine(s); 

    } 
} 

要运行测试:

var so = new so40645583(); 
so.Test();