动作<t>用法作为参数

时间:2018-07-06 20:09:36

标签: c# .net delegates .net-core

我刚从.net内核开始,发现Action<T>随处可见。我从下面的Swagger代码块中提供了示例代码。我的问题是在这里使用Action<T>有什么用?我需要传递配置数据。 Swagger如何提取配置数据?

 services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info
            {
                Version = "v1",
                Title = "My API",
                Description = "My First ASP.NET Core Web API",
                TermsOfService = "None",
                Contact = new Contact() { Name = "Talking Dotnet", Email = "x@x.com", Url = "www.x.com" }
            });
        });5

2 个答案:

答案 0 :(得分:2)

这是不返回任何内容的lambda函数。您可以在那里提供void返回方法。

这里只是使用它,以便您可以提供一个可以对T执行某些操作的函数。这意味着该库可以创建默认的选项对象,并为您提供一种修改它的方式。

该方法将执行类似的操作

public void AddFoo(Action<FooOptions> configure) {
    // Create a default configuration object
    var options = new FooOptions();

    // Let the action modify it
    configure(options);

    // Do something with the now configured options
}

答案 1 :(得分:1)

当您看到类型为Action的变量或参数时,表示它是对方法调用的引用。例如:

//Declare a method with no parameters 
void ShowMessage()
{
   Console.WriteLine("Hello world");
}

//Store a reference to that method in x
Action x = ShowMessage;

//Call that method
x();   //Displays "hello world"

使用lambda expression,您还可以内联定义方法主体,如下所示:

//Declare a lambda expression and store a reference to it in x
Action x = () => Console.WriteLine("Hello world");

//Call that method
x();   //Displays "hello world"

现在,如果您需要存储对采用参数的方法的引用该怎么办?好吧,Action<T>generic,这意味着各种Action<T>可以采用不同类型的参数。例如,Action<string>可以接受字符串参数。

void ShowMessage(string message)
{
    Console.WriteLine(message);
}

Action<string> x = ShowMessage;
x("Hello world");  //Displays "Hello world"

或作为Lambda:

Action<string> x = message => Console.WriteLine(message);
x("Hello world");  //Displays "Hello world"

当一个方法接受一个动作作为参数时,通常将被用作回调。例如,LINQ的Where方法接受对列表中的每个项目执行的委托,并使用其输出来确定是否应将该项目包括在结果中。

使用AddSwaggerGen,您将提供对Swashbuckle有时会调用的方法的引用。我相信这种情况下的方法应该生成Swagger(通常使用SwaggerDoc)。