我刚从.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
答案 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
)。