use*_*121 9 .net c# delegates .net-core
我刚开始使用 .net core,发现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
Run Code Online (Sandbox Code Playgroud)
Geo*_*yar 12
这是一个不返回任何内容的 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
}
Run Code Online (Sandbox Code Playgroud)
当您看到类型的变量或参数时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"
Run Code Online (Sandbox Code Playgroud)
使用lambda 表达式,您还可以内联定义方法体,如下所示:
//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"
Run Code Online (Sandbox Code Playgroud)
现在,如果您需要存储对带有参数的方法的引用该怎么办?嗯,Action<T>是通用的,意味着各种类型Action<T>可以采用不同类型的参数。例如,anAction<string>可以接受字符串参数。
void ShowMessage(string message)
{
Console.WriteLine(message);
}
Action<string> x = ShowMessage;
x("Hello world"); //Displays "Hello world"
Run Code Online (Sandbox Code Playgroud)
或者作为 Lambda:
Action<string> x = message => Console.WriteLine(message);
x("Hello world"); //Displays "Hello world"
Run Code Online (Sandbox Code Playgroud)
当方法接受操作作为参数时,通常将用作回调。例如,LINQ 的Where方法接受为列表中的每个项目执行的委托,并使用其输出来确定该项目是否应包含在结果中。
您将提供对AddSwaggerGenSwashbuckle 将在某个时刻调用的方法的引用。我相信这种情况下的方法应该生成 Swagger (通常使用SwaggerDoc)。