3
    public Object get()
    {
        switch (current_image_type)
        {
            case(image_type.Gray):
                return (Image<Gray, Byte>)image_object;
            case(image_type.Bgr):
                return (Image<Bgr, Byte>)image_object;
            default:
                throw new Exception("No Image type set for ImageCV");
        }
    }

所以在这个 get 函数中,直到运行时我才知道要返回什么对象类型,所以我只返回了 Object 超类。但是,这并不好,因为当我获得返回的 Object 超类时,我将无法访问Image<,>子类函数,除非我知道将其转换为什么。有没有办法让我检查什么类型的对象current_image_type在运行时返回所需的对象类型?谢谢。

4

3 回答 3

6

由于current_image_type它是包含类的可变属性,因此您根本无法在编译时知道返回类型是什么。

我会Image<T1, T2>实现一个类似的接口IImage,它封装了调用者需要的所有方法/属性。然后你可以返回一个类型化的对象:

public IImage get() { ... }

如果你不能修改Image<T1, T2>,你可以创建一种中介类来完成同样的事情:

public ImageMediator<T> : IImage
{
    private readonly Image<T, Byte> _image;

    public ImageMediator(Image<T, Byte> image)
    {
        _image = image;
    }

    // TODO implement IImage
}

然后你可以通过简单地传递给中介来获得一个IImage类型:image_object

case(image_type.Gray):
    return new ImageMediator<Gray>((Image<Gray, Byte>)image_object);
case(image_type.Bgr):
    return new ImageMediator<Bgr>((Image<Bgr, Byte>)image_object);
于 2013-10-18T05:33:48.087 回答
0
 // Example of checking for type Image<int,string>
        if(current_image_type.GetType() == typeof(Image<Int32,string))
            return (Image<Int32,string>)current_image_type;
于 2013-10-18T05:30:35.250 回答
0

几种不同的方式。您可以使用 GetType() 函数或使用“as”运算符,当且仅当它是该类型时,它将对象转换为给定类型。

我没有编译这个,所以不确定确切的语法,但你明白了......

// one way
Type t = o.get().GetType();
if ( t == typeof( Image<Gray, Byte> ) {
// we have an Image<Gray, Byte>
}

// another way
Image<Gray, Byte> grb = o.get() as Image<Gray, Byte>;
if ( grb != null ) {
// we have an Image<Gray,Byte>
}
于 2013-10-18T05:35:08.470 回答