#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
}