Сопоставление “строки” и метода

247
05 января 2017, 04:44

Суть работы программы такова: выбирается цель, в textbox вводится какая-либо команда, которая вызывает тот или иной метод из списка методов, который у каждой цели свой. Каким образом можно реализовать сопоставление строки и метод в данном случае? Методы имеют одинаковую сигнатуру и принимают аргумент Object. Например, вводимая команда "zapros" выводит на экран true или flase(зависит всё это от цели, которую выбрали)

Answer 1

Пример консольной программы. С помощью интерфейса организуем разное выполнение одного и того же вызова метода. Вызываем нужный метод по выбору пользователя, но выполняется он по разному в зависимости от класса.

//создаем интерфейс в котором описываем метод(ы)
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);
    }
}
Answer 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 соответственно.

Ещё можно использовать рефлексию, итерируюсь по нужным классам, находить нужный метод. Но этот приём следует использовать с большой осторожностью.

Answer 3

Можно использовать switch или if.

Анализируешь текст юзера и условными операторами вызываешь нужный метод.

Если методы имеют одинаковую сигнатуру, то можешь поместить эти методы в Dictionary<string,delegate> и по ключу дергать нужный метод.

А еще есть паттерн "команда"

READ ALSO
Как дописать данные в уже существующий бинарный файл C#

Как дописать данные в уже существующий бинарный файл C#

Всем доброго времени суток, помогите пожалуйста разобраться как дописать данные в бинарный файл ? Есть код который записывает значение в файл...

323
В чем выигрыш от реализации абстрактным классом интерфейса?

В чем выигрыш от реализации абстрактным классом интерфейса?

В ADONET есть классы, наследуются от абстрактных, а абстрактные классы в свою очередь реализуют интерфейс

287
Как добавить/получить ряд в Linq?

Как добавить/получить ряд в Linq?

Не могу разобраться как добавить новый ряд в таблицу sql

287
CORS и IIS - существуют ли стандартные средства ?

CORS и IIS - существуют ли стандартные средства ?

Возникла необходимость выполнять кроссдоменный запрос к приложению, поднятому на IIS на другом доменеНужно обращаться к веб-сервису

294