Вызов делегата действия в параметре метода - PullRequest
0 голосов
/ 20 апреля 2020

Может кто-нибудь сказать мне, пожалуйста, как я могу вызвать делегат из некоторого параметра метода? Ниже я покажу вам кусочек моего кода.

    TestMethod(p =>
                {
                    p.Name = "SomeTool";
                    p.Color = Tool.ToolColor.Red;
                    p.GetToolInfo();
                });

    static void TestMethod(Action<Tool> tool)
    {
       //tool.Invoke(); ????
    }
class Tool
{
    public string Name { get; set; }
    public ToolColor Color { get; set; }

    public enum ToolColor
    {
        Black,
        White,
        Red
    }

    public string GetToolInfo()
    {
        return $"{Name} {Color}";
    }
}

Ответы [ 3 ]

0 голосов
/ 20 апреля 2020

Я не совсем понимаю, что вы пытаетесь сделать здесь, но я быстро разобью, как работает тип Action.

Тип Action действует как указатель на функцию, которую можно передать вокруг (в основном делегат с обобщенным синтаксисом c). На самом деле существует два типа этих типов: Func и Action. Разница между Func и Action заключается в том, что Func имеет универсальный возвращаемый параметр c, тогда как Action всегда возвращает void.

Вы вызываете Action, используя синтаксис вызова метода :

void Test(Action action)
{
    action();
}

Теперь параметры generi c являются параметрами в том порядке, в котором они требуются в действии.

В вашем случае у вас есть следующее Action:

Action<Tool>

, который эквивалентен этому объявлению делегата:

delegate void Action(Tool tool);

Так что, когда вы хотите вызвать этот метод, вы должны передать параметр, который соответствует данному обобщению c тип параметра. Сам метод ничего не возвращает.

Чтобы получить метод для выполнения, вы должны написать следующее:

void TestMethod(Action<Tool> tool)
{
    tool(new Tool());
}

Дополнительная информация:

0 голосов
/ 20 апреля 2020

Вашему методу испытаний нужен инструмент.

    Tool myTool = new Tool();
    Action<Tool> myAction = p =>
                {
                    p.Name = "SomeTool";
                    p.Color = Tool.ToolColor.Red;
                    p.GetToolInfo();
                };
    TestMethod(myAction, myTool);
    Console.WriteLine(myTool.Name); // prints "SomeTool"
    static void TestMethod(Action<Tool> action, Tool tool)
    {
       action(tool);
    }
0 голосов
/ 20 апреля 2020

Action<Tool> = Method(Tool tool) Ваш делегат соответствует сигнатуре метода. Затем вы просто вызываете метод, переданный в качестве делегата, используя ваш параметр. Это позволяет использовать различные проводные методы, соответствующие подписи делегата

static void TestMethod(Action<Tool> method)
{

   method(new Tool());
}
...