如何创建匿名列表functions/delegates C#
How to create a list of anonymous functions/delegates C#
我有一个像这样的列表对象
private List<Func<int, double, char, string, string>> FuncList;
并且一直在尝试使用委托和匿名函数将项目添加到此列表中。问题是,当我尝试创建具有这种类型的函数时,我必须 return 来自该函数的函数。我设法以递归方式执行此操作,但这会使它陷入无限循环。是否可以向此列表添加功能,如果可以,如何添加?
我正在尝试添加像这样传递给委托的函数
public delegate Func<int, double, char, string, string> funcDelegate(someFunc);
然后做这样的事情
FuncList.add(funcDelegate);
您将如何编写 someFunc 以使此代码能够运行。
我尝试编写一个 return 是正确类型的函数失败了,这不起作用,因为它是递归的,没有停止条件。
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);
}
首先,您的方法没有正确的签名。 Func<>
中的最后一个通用参数是 return 类型。 Action<>
是 return 无效的通用委托类型。
其次,使用 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));
}
}
在您的示例中,您声明了一个函数的委托,该函数 return 是另一个委托,但这似乎不是您想要完成的。
这是我的两分钱的价值 - 它处理最多 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();
我有一个像这样的列表对象
private List<Func<int, double, char, string, string>> FuncList;
并且一直在尝试使用委托和匿名函数将项目添加到此列表中。问题是,当我尝试创建具有这种类型的函数时,我必须 return 来自该函数的函数。我设法以递归方式执行此操作,但这会使它陷入无限循环。是否可以向此列表添加功能,如果可以,如何添加?
我正在尝试添加像这样传递给委托的函数
public delegate Func<int, double, char, string, string> funcDelegate(someFunc);
然后做这样的事情
FuncList.add(funcDelegate);
您将如何编写 someFunc 以使此代码能够运行。
我尝试编写一个 return 是正确类型的函数失败了,这不起作用,因为它是递归的,没有停止条件。
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);
}
首先,您的方法没有正确的签名。 Func<>
中的最后一个通用参数是 return 类型。 Action<>
是 return 无效的通用委托类型。
其次,使用 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));
}
}
在您的示例中,您声明了一个函数的委托,该函数 return 是另一个委托,但这似乎不是您想要完成的。
这是我的两分钱的价值 - 它处理最多 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();