如何创建匿名函数/委托列表C#

如何创建匿名函数/委托列表C#,c#,list,delegates,func,C#,List,Delegates,Func,我有一个这样的列表对象 private List<Func<int, double, char, string, string>> FuncList; 您将如何编写someFunc以使此代码正常工作 我在编写返回正确类型的函数时失败的尝试是这样的,这不起作用,因为它是递归的,没有停止的情况 public Func<int, double, char, string, string> SomeFunc(int i, double d, char

我有一个这样的列表对象

        private List<Func<int, double, char, string, string>> FuncList;
您将如何编写someFunc以使此代码正常工作

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

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);
    }
public Func SomeFunc(int i,double d,char c,string s1,string s2)
{
Console.WriteLine($“{i}\n{d}\n{c}\n{s1}\n{s2}”);
返回这个.SomeFunc(i,d,c,s1,s2);
}

首先,您的方法没有正确的签名。
Func
中的最后一个通用参数是返回类型<代码>操作是返回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));
        }
    }
//接受整数并返回字符串的委托列表
私有静态列表delegateList=新列表();
公共静态字符串Foo(int x)
{
返回$“Foo{x}”;
}
公共静态无效测试()
{
delegateList.Add(Foo);//将委托添加到命名方法
Add(delegate(intx){return$“Bar{x*2}”;});//将委托添加到匿名方法
delegateList.Add(x=>$“Baz{x*3}”);//将委托添加到lambda
foreach(委托人列表中的变量del)
{
控制台写入线(del(23));
}
}

在您的示例中,您向返回另一个委托的函数声明了一个委托,但这似乎不是您要完成的任务。

首先,您的方法没有正确的签名。
Func
中的最后一个通用参数是返回类型<代码>操作是返回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));
        }
    }
//接受整数并返回字符串的委托列表
私有静态列表delegateList=新列表();
公共静态字符串Foo(int x)
{
返回$“Foo{x}”;
}
公共静态无效测试()
{
delegateList.Add(Foo);//将委托添加到命名方法
Add(delegate(intx){return$“Bar{x*2}”;});//将委托添加到匿名方法
delegateList.Add(x=>$“Baz{x*3}”);//将委托添加到lambda
foreach(委托人列表中的变量del)
{
控制台写入线(del(23));
}
}

在您的示例中,您向一个返回另一个委托的函数声明了一个委托,但这似乎不是您想要完成的。

这是我的两分钱的价值-它可以处理具有最多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);

    }
}

这是我的两分钱的价值-它处理任意委托,最多有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);

    }
}

你的问题不清楚。请添加更多代码。C#中没有匿名函数/委托。您的问题尚不清楚。请添加更多代码。C#中没有匿名函数/委托。非常感谢!这有助于明确我做错了什么。太棒了,谢谢!这有助于明确我做错了什么。
var so = new so40645583();
so.Test();