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 スーパー クラスを返しました。Image<,>ただし、返された Object スーパークラスを取得したときに、何にキャストするかがわからない限り、サブクラス関数にアクセスできないため、これは良くありません。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 に答える