C#使用lambda表达式

时间:2018-06-18 13:54:29

标签: c# .net-core

任何使用ASP.Net的人都可能看到过接受用于配置某些选项的Action<T>委托的方法。以ASP.Net Core MVC Startup.cs为例,以此为例。

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication().AddJwtBearer(options => {
        options.Audience = "something";
        // ...
    });

    //...
}

.AddJwtBearer()方法将Action<T>委托与lambda表达式中配置的参数一起使用,我正在尝试做的是在我的一个项目中复制它,但没有运气。 我得到了Method(Action<T> action)部分,但我似乎无法检索调用该方法时配置的结果对象。

上下文的一些代码:

构建器类方法:

public ReporterBuilder SetEmail(Action<EmailConfig> config)
{
    if (config is null)
        throw new ArgumentNullException();

    // Get configured EmailConfig somehow...

    return this;
}

EmailConfig模型:

public class EmailConfig
{
    public EmailProvider EmailProvider { get; set; }
    public string Host { get; set; }
    public int Port { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string FromAddress { get; set; }
    public string ToAddress { get; set; }
}

所以我想在这里实现的是:

Reporter reporter = new ReporterBuilder()
    .SetEmail(config => {
        config.EmailProvider = EmailProvider.Other;
        config.Host = "something";
        // ...
    })
    .Build();

我查看了GitHub上的一些Microsoft存储库(aspnet / DependencyInjection,aspnet / Options被认为是使用这种方法的两个主要的IoC容器)来了解它们如何从Action<T>中获取值代表,绝对没有运气。

几个小时的互联网搜索也没有帮助,因为大多数文章已经过时或者与我正在尝试做的事情无关。

我非常欢迎任何有关如何使这项工作的帮助,也欢迎提出更好的方法建议。

1 个答案:

答案 0 :(得分:7)

您的方法需要实例化对象,然后调用方法,将对象传递给方法。 const role = 'super_admin'; const str = role .split('_') .map(word => word = word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) .join(' '); console.log(str);将返回一个对象。这是Func<T>,不会返回任何内容。相反,它接受该对象。

ActionT<T>