0

クラスがあるとしましょう。このクラスには System.Drawing.Bitmap であるパブリック プロパティが含まれていますが、クラスのコンシューマーがこの値をさまざまな種類の画像で設定できるようにしたいと考えています。彼らが何を渡しているのか考えてみてください。必要な変換は舞台裏で行います。これが私が意味することです:

var myBitmapImage = new BitmapImage();
var writeableBitmap = new WriteableBitmap(myBitmapImage);
var mySystemDrawingBitmap = new Bitmap(@"A:\b.c");

var classOne = new TestClass();
var classTwo = new TestClass();
var classThree = new TestClass();

//This should work:
classOne.MyImage = myBitmapImage;

//This should also work:
classTwo.MyImage = writeableBitmap;

//This should work too
classThree.MyImage = mySystemDrawingBitmap;

現時点では、次のようなことを考えています。

public class TestClass
{
    private Bitmap _myImage;

    public object MyImage
    {
        get
        {
            return _myImage;
        }

        set
        {
            if (value is Bitmap)
            {
                _myImage = (Bitmap)value;
            }

            if (value is BitmapImage)
            {
                var imageAsSystemDrawingBitmap = ConvertBitmapImageToBitmap((BitmapImage)value);
                _myImage = imageAsSystemDrawingBitmap;
            }

            if (value is WriteableBitmap)
            {
                var imageAsSystemDrawingBitmap = ConvertWriteableBitmapToBitmap((WriteableBitmap)value);
                _myImage = imageAsSystemDrawingBitmap;
            }

            throw new Exception("Invalid image type");
        }
    }

    private Bitmap ConvertWriteableBitmapToBitmap(WriteableBitmap value)
    {
        //do work here
        return null;
    }

    private Bitmap ConvertBitmapImageToBitmap(BitmapImage value)
    {
        //do work here
        return null;
    }
}

しかし、オブジェクトの使用とキャストは非常に 2001 年に感じられます。これを実現するには、もっと雄弁な方法があるに違いないと確信しています。ありますか、それともそもそもこれは悪い考えですか?

4

1 に答える 1

2

BitmapFactoryを作成するためのファクトリとして動作するクラスを作成できます。Factory Design PatternBitmapについて詳しく読むことができます。

public class TestClass
{
    public BitmapFactory BitmapFactory { get; set; }
    public Bitmap Bitmap { get { return this.BitmapFactory.Bitmap; } }
}

public interface IBitmapFactory
{
    Bitmap Bitmap { get; }
}

public class BitmapFactory : IBitmapFactory
{
    public Bitmap Bitmap { get; private set; }

    public BitmapFactory(Bitmap value)
    {
        this.Bitmap = value;
    }

    public BitmapFactory(BitmapImage value)
    {
        this.Bitmap = ConvertBitmapImageToBitmap(value);
    }

    public BitmapFactory(WriteableBitmap value)
    {
        this.Bitmap = ConvertWriteableBitmapToBitmap(value);
    }

    private Bitmap ConvertWriteableBitmapToBitmap(WriteableBitmap value)
    {
        //do work here
        return null;
    }

    private Bitmap ConvertBitmapImageToBitmap(BitmapImage value)
    {
        //do work here
        return null;
    }
}
于 2013-01-23T17:47:14.467 に答える