Вызывающие методы C# в универсальных классах

Я расширяю управление ImageBox от EmguCV. Управление Image свойство может быть установлено на что-либо, реализовав IImage интерфейс.

Вся следующая реализация этот интерфейс:

Image<Bgr, Byte>
Image<Ycc, Byte>
Image<Hsv, Byte>

Теперь я хочу звонить Draw метод на объекте вышеупомянутого типа (чем когда-либо это может быть).

Проблема состоит в том, когда я получаю доступ к Свойству изображения, тип возврата IImage. IImage не реализует Draw метод, но все вышеупомянутое делает.

Я полагаю, что могу бросить объект типа IImage к одному из вышеупомянутого (правильное) и я могу получить доступ Draw метод. Но как я знаю, каков правильный? Если у Вас есть лучший способ сделать это, предложите это также.

Править

Извините, но я забыл упоминать важную информацию. Метод Ничьей для каждого вышеупомянутого класса берет один различный аргумент. Для, например. Draw для Image<Bgr, Byte> берет аргумент типа Bgr и Draw для Image<Hsv, Byte> берет аргумент типа Hsv вместо этого.

6
задан Aishwar 14 March 2010 в 20:36
поделиться

7 ответов

Как насчет чего-то вроде этого:

void foo( IImage image )
{
    if ( image is Image<Bgr, Byte> )
    {
        ((Image<Bgr, Byte>)(image)).Draw();
    }

    // handle the other types the same way.
}
0
ответ дан 17 December 2019 в 04:45
поделиться

Добавьте IDrawableImage, унаследованный от IImage.

public interface IDrawableImage : IImage
{
   void Draw(object val);
   void Draw();
}

Затем вы можете просто сделать следующее:

var drawableImage = container.Image as IDrawableImage;
if (drawableImage != null)
    drawableImage.Draw();

Чтобы соответствовать вашему разъяснению выше:

public interface IDrawableImage<T, B> : IDrawableImage where B : byte
{
    void Draw<T>(T val);
}

тогда, если вы знаете тип:

var value = new Hvr();
var drawableImage = container.Image as IDrawableImage<Hvr, Byte>;
if (drawableImage != null)
    drawableImage.Draw(value);

, если вы не знаете

var value = new Hvr();
var drawableImage = container.Image as IDrawableImage;
if (drawableImage != null)
    drawableImage.Draw(value);
3
ответ дан 17 December 2019 в 04:45
поделиться

Или вы можете использовать динамические методы и рискнуть.

0
ответ дан 17 December 2019 в 04:45
поделиться

Если я вас правильно понял - класс Image реализует метод рисования. Я не знаю, как вы собираетесь его использовать, но вы можете сделать это следующим образом:

private void DrawImage<T1, T2>(Image<T1, T2> image)
{
    image.Draw();
}

Основная проблема выше заключается в том, что вызывающий вышеупомянутый метод должен указать типы T1 и T2.

Если у вас нет контроля над интерфейсом IImage и его реализациями, я думаю, вы выберете одно из двух решений: указать типы T1 и T2 или иметь ifs / переключатели со всеми возможными реализациями IImage.

Если у вас есть доступ к интерфейсу IImage и классу Image, вам следует добавить общий интерфейс IImage и добавить к нему метод Draw.

1
ответ дан 17 December 2019 в 04:45
поделиться

У вас должен быть общий интерфейс, который добавляет Draw ().

1
ответ дан 17 December 2019 в 04:45
поделиться

В вашем вопросе отсутствует важная информация: код, который вы хотите написать.

Нам нужно знать, как вы собираетесь писать код, вызывающий метод Draw (...) .

0
ответ дан 17 December 2019 в 04:45
поделиться

Если вы уверены, что изображение , которое у вас будет (независимо от типов), будет иметь метод Draw, вы можете используйте отражение и взломайте вокруг него:

Я бы сделал это как метод расширения:

public static void Draw(this IImage image)
{
   var method = image.GetType().GetMethod("Draw");
   if(method != null)
   {
      method.Invoke(image,null);
   }
}

Это немного похоже на взлом, но опять же, я бы сказал, что API неправильно спроектирован. Должен быть хотя бы какой-нибудь класс Drawer или что-то, что знает, как действовать с изображением.

0
ответ дан 17 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: