Суть работы программы такова: выбирается цель, в textbox вводится какая-либо команда, которая вызывает тот или иной метод из списка методов, который у каждой цели свой. Каким образом можно реализовать сопоставление строки и метод в данном случае? Методы имеют одинаковую сигнатуру и принимают аргумент Object. Например, вводимая команда "zapros" выводит на экран true или flase(зависит всё это от цели, которую выбрали)
Пример консольной программы. С помощью интерфейса организуем разное выполнение одного и того же вызова метода. Вызываем нужный метод по выбору пользователя, но выполняется он по разному в зависимости от класса.
//создаем интерфейс в котором описываем метод(ы)
public interface IMakeSound
{
void Sound(int i = 1);
void Noise();
}
//cоздаем два класса реализующие этот интерфейс
public class Car : IMakeSound
{
public void Noise()
{
Console.WriteLine("ИИИИИИИ!");
}
public void Sound(int count = 1)
{
for (int i = 0; i < count; i++)
{
Console.WriteLine("Би-би!");
}
}
}
public class Cow : IMakeSound
{
public void Noise()
{
Console.WriteLine("УУУУУУ!");
}
public void Sound(int count = 1)
{
for (int i = 0; i < count; i++)
{
Console.WriteLine("Му-му!");
}
}
}
class Program
{
static void Main(string[] args)
{
int i = 0;
IMakeSound target = null;
while (i == 0)
{
Console.WriteLine("Укажите цель (Корова, Машина, Выход):");
string targetString = Console.ReadLine();
switch (targetString)
{
case "Корова":
target = new Cow();
i = 1;
break;
case "Машина":
target = new Car();
i = 1;
break;
case "Выход":
return;
default:
Console.WriteLine("Цель указана неверно, для выхода наберите Выход");
break;
}
}
while (i == 1)
{
Console.WriteLine("Укажите задачу (Шум, Звук, Выход):");
string targetDoing = Console.ReadLine();
switch (targetDoing)
{
case "Шум":
WantNoise(target);
i = 2;
break;
case "Звук":
WantSound(target);
i = 2;
break;
case "Выход":
return;
default:
Console.WriteLine("Задача указана неверно, для выхода наберите Выход");
break;
}
}
Console.ReadKey();
}
private static void WantNoise(IMakeSound obj)
{
obj.Noise();
}
private static void WantSound(IMakeSound obj)
{
obj.Sound(2);
}
}
Для данной программы можно реализовать сопоставление с помощью словаря:
var methodTable = new Dictionary<string, Action<object>>
{
["delete"] = delete,
["upload"] = upload,
["add"] = add
};
где delete
, upload
, add
методы программы.
Затем проверять наличие данного метода с помощью метода ContainsKey
и в случае наличия вызывать по ключу.
Если имена методы совпадают с ключами то можно также использовать оператор nameof
:
var methodTable = new Dictionary<string, Action<object>>
{
[nameof(delete)] = delete,
[nameof(upload)] = upload,
[nameof(add)] = add
};
Также можно просто применять if
и switch
для проверки ключа.
Если нужна нечувствительная к регистру проверка, то используйте к примеру
if ("delete".Equals(textbox.Text, StringComparison.OrdinalIgnoreCase))
или для switch
приведите текст в нижний или верхний регистр с помощью ToLowerInvariant
или ToUpperInvariant
соответственно.
Ещё можно использовать рефлексию, итерируюсь по нужным классам, находить нужный метод. Но этот приём следует использовать с большой осторожностью.
Можно использовать switch
или if
.
Анализируешь текст юзера и условными операторами вызываешь нужный метод.
Если методы имеют одинаковую сигнатуру, то можешь поместить эти методы в Dictionary<string,delegate>
и по ключу дергать нужный метод.
А еще есть паттерн "команда"
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Всем доброго времени суток, помогите пожалуйста разобраться как дописать данные в бинарный файл ? Есть код который записывает значение в файл...
В ADONET есть классы, наследуются от абстрактных, а абстрактные классы в свою очередь реализуют интерфейс
Возникла необходимость выполнять кроссдоменный запрос к приложению, поднятому на IIS на другом доменеНужно обращаться к веб-сервису