Я расширяю управление 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
вместо этого.
Как насчет чего-то вроде этого:
void foo( IImage image )
{
if ( image is Image<Bgr, Byte> )
{
((Image<Bgr, Byte>)(image)).Draw();
}
// handle the other types the same way.
}
Добавьте 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);
Или вы можете использовать динамические методы и рискнуть.
Если я вас правильно понял - класс Image реализует метод рисования. Я не знаю, как вы собираетесь его использовать, но вы можете сделать это следующим образом:
private void DrawImage<T1, T2>(Image<T1, T2> image)
{
image.Draw();
}
Основная проблема выше заключается в том, что вызывающий вышеупомянутый метод должен указать типы T1 и T2.
Если у вас нет контроля над интерфейсом IImage и его реализациями, я думаю, вы выберете одно из двух решений: указать типы T1 и T2 или иметь ifs / переключатели со всеми возможными реализациями IImage.
Если у вас есть доступ к интерфейсу IImage и классу Image, вам следует добавить общий интерфейс IImage и добавить к нему метод Draw.
У вас должен быть общий интерфейс, который добавляет Draw ().
В вашем вопросе отсутствует важная информация: код, который вы хотите написать.
Нам нужно знать, как вы собираетесь писать код, вызывающий метод Draw (...)
.
Если вы уверены, что изображение
Я бы сделал это как метод расширения:
public static void Draw(this IImage image)
{
var method = image.GetType().GetMethod("Draw");
if(method != null)
{
method.Invoke(image,null);
}
}
Это немного похоже на взлом, но опять же, я бы сказал, что API неправильно спроектирован. Должен быть хотя бы какой-нибудь класс Drawer или что-то, что знает, как действовать с изображением.