存储来自委托的值

Storing values from delegates

如果我有一个委托,然后我向它添加了几个方法,我该如何分别存储每个返回值?

举例来说,我有类似下面的内容,我该怎么做才能从两种方法中获得两个值,以便我可以在 PlayWithDelegate 方法中显示它们,我是只设置一个静态数组并将结果存储在那里还是还有别的办法吗?

public delegate string EnterName();

internal class Class1
{
    //Our delegate
    public delegate string EnterName();

    static void Main(string[] args)
    {
        EnterName testname = Getname;
        testname += GetAge;
        PlayWithDelegate(testname());
    }

    private static string GetAge()
    {
        Console.WriteLine("Please enter your age : ");
        string result = Console.ReadLine();
        if (result == "") result = " a mystery";
        return result;
    }

    private static void PlayWithDelegate(string name)
    {
        Console.WriteLine( "your name is {0} and age is {1}",name, name );
        Console.ReadLine();
    }

    public static string Getname( )
    {
        Console.WriteLine("Please enter your name : ");
        string result = Console.ReadLine();
        if (result == "") result = " a mystery";
        return result;
    }
}

您可以将它们存储为单独的值。我对您的解决方案稍作修改。

在您的代码中,您将函数委托重新分配给另一个委托,因此它会替换之前的值。这就是为什么结果最终只显示年龄而不是姓名和年龄。

在修改后的代码中,我确保将两个委托分配给函数并将它们分开,然后我在 PlayWithDelegate 函数中调用这些委托。

public delegate string UserInput();

internal class Class1
{
    static void Main(string[] args)
    {
        UserInput name = Getname;
        UserInput age = GetAge;
        PlayWithDelegate(name, age);
    }

    private static string GetAge()
    {
        Console.WriteLine("Please enter your age : ");
        string result = Console.ReadLine();
        if (result == "") result = " a mystery";
        return result;
    }

    private static void PlayWithDelegate(UserInput name, UserInput age)
    {
        Console.WriteLine("your name is {0} and age is {1}", name(), age());
        Console.ReadLine();
    }

    public static string Getname()
    {
        Console.WriteLine("Please enter your name : ");
        string result = Console.ReadLine();
        if (result == "") result = " a mystery";
        return result;
    }
}

您还提到可能将结果存储到某种集合中,您也可以这样做...

public delegate string UserInput();

internal class Class1
{

    static void Main(string[] args)
    {
        UserInput[] inputs = new UserInput[] { Getname, GetAge };       
        string[] results = inputs.Select(func => func()).ToArray();     
        PlayWithDelegate(results);
    }

    private static string GetAge()
    {
        Console.WriteLine("Please enter your age : ");
        string result = Console.ReadLine();
        if (result == "") result = " a mystery";
        return result;
    }

    private static void PlayWithDelegate(string[] results)
    {
        Console.WriteLine("your name is {0} and age is {1}", results[0], results[1]);
        Console.ReadLine();
    }

    public static string Getname()
    {
        Console.WriteLine("Please enter your name : ");
        string result = Console.ReadLine();
        if (result == "") result = " a mystery";
        return result;
    }
}