Передача лямбда-выражения в метод C#

#c# #delegates

#c# #делегаты

Вопрос:

Не могли бы вы подсказать, как я могу реализовать класс «Alexa»?

 var alexa = new Alexa();
        Console.WriteLine(alexa.Talk()); //print hello, i am Alexa
        alexa.Configure(x =>
        {
            x.GreetingMessage = "Hello { OwnerName}, I am at your service";
            x.OwnerName = "Bob Marley";
        });
        Console.WriteLine(alexa.Talk()); //print Hello Bob Marley, I am at your service
  

Я попытался реализовать метод как:

 public void Configure(Action<Configration> p)
    {
        
    }

public class Configration
{
    public string GreetingMessage { get; set; }
    public string OwnerName { get; set; }
}
  

Но я не могу понять, как запустить GreetingMessage.

Спасибо

Комментарии:

1. Я не понимаю, как «Передача лямбда-выражения в метод C #» связана с предложением о том, как реализовать класс?

Ответ №1:

Вы можете сделать это следующим образом:

 public class Alexa
{
    private Configration _configration;

    public Alexa()
    {
        _configration = new Configration
        {
            // This sets the default message you wanted.
            GreetingMessage = "Hello, I am Alexa."
        };
    }

    public void Configure(Action<Configration> configuration)
    {
        // I'll explain this below.
        configuration(_configration);
    }

    public string Talk()
    {
        return _configration.GreetingMessage;
    }
}
  

Но вам нужно изменить способ вызова этого, чтобы получить желаемый результат. Когда вы делаете это:

 alexa.Configure(x =>
{
    x.GreetingMessage = $"Hello {x.OwnerName}, I am at your service";
    x.OwnerName = "Bob Marley";
});
  

на самом деле он будет печатать Hello , I am at your service вместо предполагаемого Hello Bob Marley, I am at your service . Это связано OwnerName с тем, что для него еще не установлено значение Bob Marley . Чтобы исправить это, нам нужно изменить назначение на OwnerName to come до того, как оно будет использовано в приветствии, вот так:

 alexa.Configure(x =>
{
    x.OwnerName = "Bob Marley";
    x.GreetingMessage = $"Hello {x.OwnerName}, I am at your service";
});
  

Наконец, вы можете задаться вопросом, что configuration(_configration); происходит. На самом деле это сокращение для configuration.Invoke(_configration); , которое выполнит Action делегат, передаваемый _configration в качестве Configuration параметра.

Вызываем его, используя следующее:

 static void Main(string[] args)
{
    var alexa = new Alexa();
    Console.WriteLine(alexa.Talk());
    alexa.Configure(x =>
    {
        x.OwnerName = "Bob Marley";
        x.GreetingMessage = $"Hello {x.OwnerName}, I am at your service";
    });
    Console.WriteLine(alexa.Talk());
}
  

Приводит к:

 Hello, I am Alexa.
Hello Bob Marley, I am at your service
  

Ответ №2:

Если у вас есть доступ к методу talk, просто передайте конфигурацию действию. Затем извлеките информацию из класса, который вы передали действию.

 public class Configration
{
    public string GreetingMessage { get; set; }
    public string OwnerName { get; set; }
}

public class Alexa()
{
    public Configration ConfigurationModel { get; set; }
    public Action<Configration> Configration { get; set; }

    public void Talk()
    {
        this.Configuration.Invoke(ConfigurationModel);
        Console.WriteLine(ConfigurationModel.GreetingMessage);
    }
}

void main()
{
    var alexa = new Alexa();
    Console.WriteLine(alexa.Talk()); //print hello, i am Alexa
    alexa.Configure(x =>
    {
        x.GreetingMessage = "Hello { OwnerName}, I am at your service";
        x.OwnerName = "Bob Marley";
    });
    Console.WriteLine(alexa.Talk()); //print Hello Bob Marley, I am at your service
}