C#返回正确的对象类型 public Object get() { 开关(当前图像类型) { 外壳(图像类型为灰色): 返回(图像)图像对象; 案例(图像类型Bgr): 返回(图像)图像对象; 违约: 抛出新异常(“没有为ImageCV设置图像类型”); } }

C#返回正确的对象类型 public Object get() { 开关(当前图像类型) { 外壳(图像类型为灰色): 返回(图像)图像对象; 案例(图像类型Bgr): 返回(图像)图像对象; 违约: 抛出新异常(“没有为ImageCV设置图像类型”); } },c#,generics,object,return,emgucv,C#,Generics,Object,Return,Emgucv,所以在这个get函数中,直到运行时我才知道返回什么对象类型,所以我只返回了对象超类。然而,这并不好,因为当我得到返回的对象超类时,我将无法访问Image子类函数,除非我知道将它转换为什么。是否有办法检查运行时返回所需对象类型的对象current\u image\u type?谢谢。//检查类型图像的示例 public Object get() { switch (current_image_type) { case(imag

所以在这个get函数中,直到运行时我才知道返回什么对象类型,所以我只返回了对象超类。然而,这并不好,因为当我得到返回的对象超类时,我将无法访问
Image
子类函数,除非我知道将它转换为什么。是否有办法检查运行时返回所需对象类型的对象
current\u image\u type
?谢谢。

//检查类型图像的示例
    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");
        }
    }

如果(current_image_type.GetType()==typeof(image因为
current_image_type
是包含类的可变属性,那么在编译时您根本无法知道返回类型是什么

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

 // Example of checking for type Image<int,string>
        if(current_image_type.GetType() == typeof(Image<Int32,string))
            return (Image<Int32,string>)current_image_type;

如果无法修改
图像
,则可以创建一种中介类来完成相同的任务:

public IImage get() { ... }

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

我没有编译这个,所以不确定确切的语法,但你得到的想法

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);
//单向
类型t=o.get().GetType();
if(t==typeof(图像){
//我们有一个形象
}
//另一种方式
Image grb=o.get()作为图像;
如果(grb!=null){
//我们有一个形象
}

我知道由于泛型参数擦除,这种方法在Java中不起作用。但我不知道C。
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);
// 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>
}