我正在从 EmguCV 扩展 ImageBox 控件。控件的 Image
属性可以设置为任何实现 IImage
的东西界面。
以下所有实现此接口(interface):
Image<Bgr, Byte>
Image<Ycc, Byte>
Image<Hsv, Byte>
现在我想调用Draw
上述类型的对象上的方法(无论它可能是什么)。
问题是当我访问 Image 属性时,返回类型是 IImage
. IImage 没有实现 Draw
方法,但以上所有方法都可以。
我相信我可以转换类型为 IImage
的对象到上面的其中一个(右边的那个),我可以访问 Draw
方法。但是我怎么知道什么是正确的呢?如果您有更好的方法,也请提出建议。
编辑
抱歉,我忘了提一条重要信息。上述每个类的 Draw 方法都有一个不同的参数。例如Draw
对于 Image<Bgr, Byte>
采用 Bgr
类型的参数和 Draw
对于 Image<Hsv, Byte>
采用 Hsv
类型的参数相反。
最佳答案
添加一个继承自 IImage 的 IDrawableImage。
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);
关于C# 在泛型类中调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2443593/