Как сопоставить условие с классом (реализует интерфейс) и вызвать его метод apply - PullRequest
0 голосов
/ 21 апреля 2020

В моем консольном приложении у меня есть интерфейс с именем IFileConverter , указанный ниже:

public interface IFileConverter
{
    string InputFileFormat { get; }
    string OutputFileFormat { get; }
    object Convert(object input);
}

И некоторые из шаблонов классов, которые реализуют этот интерфейс: Png2JpgConverter код класса:

/// <summary>
/// Image of class of converter Png file to Jpg file.
/// </summary>
public class Png2JpgConverter : IFileConverter
{
    public string InputFileFormat => "png";

    public string OutputFileFormat => "jpg";

    public object Convert(object input) => "this is a jpg file.";   // TODO ...
}

и другой класс, например: Jpg2BmpConverter код класса:

/// <summary>
/// Image of class of converter Jpg file to Bmp file.
/// </summary>
public class Jpg2BmpConverter : IFileConverter
{
    public string InputFileFormat => "jpg";

    public string OutputFileFormat => "bmp";

    public object Convert(object input) => "this is a bmp file.";   // TODO ..
}

И у меня есть InputFileFormat , который это: string inputFileFormat = "png";

OutputFileFormat , что: string outputFileFormat = "jpg";

И объект object input = "this is a png file.";

Мой вопрос таков; я хочу вызвать Convert () метод соответствующего класса для мнимого процесса преобразования. Но мне нужно сделать это в действительной операции. Есть ли способ сделать это, как указано ниже?

static void Main(string[] args)
    {
        string inputFileFormat = "png";
        string outputFileFormat = "jpg";
        object input = "this is a png file."; // for example


        //here i want to call method of Convert() like this:
        if(var selectedConverter is IFileConverter converter)
        {
            object output = selectedConverter.Convert(input);
        }
        // but i don't know how to do it and how to match inputFileFormat and outputFileFormat
        // in appropriate class that impelents IFileConverter interface...
    }

Любая помощь будет хорошей ..

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Изображение в памяти представляет собой только матрицу Ширина X Высота X Каналы. PNG и JPG - это методы сжатия, используемые для сохранения этих матриц на диске.

Хотите конвертировать файлы на диске?

bmp -> png пример

string filepath = "PathToBMPImage.bmp";
string savePath = "PathToPngOutout.png";
//Load the image, don't use new System.Drawing.Bitmap(string path) because it'll convert the image in 32BPP
using(var bmp = (System.Drawing.Bitmap)System.Drawing.Image.FromFile(filepath))
 //Now inside bmp there is a matrix WxHxC
 bmp.Save(savePath, System.Drawing.Imaging.ImageFormat.Png);

Все кодировщики и декодеры GDI здесь . Вы можете добавить параметры в параметры кодировщика, такие как сжатие JPG.

0 голосов
/ 21 апреля 2020

если я понял, что вы имели в виду, я думаю, что концепция "Полиморфизм" поможет в такой ситуации

var converters = new List<IFileConverter> {new Jpg2BmpConverter(), new Png2JpgConverter()};

var outputList = new List<object>();

foreach (var fileConverter in converters)
{
    outputList.Add(fileConverter.Convert(input));
}

теперь у вас есть список выходов, вы можете делать то, что вы хотите с это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...