SolidBrush.Clone выдает исключение

Я использую различные типы кистей, таких как SolidBrush, HatchBrush и т. д., чтобы рисовать сложные формы и текст в моих окнах контроля формы. Код, который я использую,

protected void FillShape(Brush myBrush, GraphicsPath shape)
        {
            if (myBrush is SolidBrush)
            {
                using (SolidBrush sbr = myBrush.Clone() as SolidBrush)
                {
                    //Code for drawing with solid brush
                }
            }
            else if (myBrush is HatchBrush)
            {                    
                    //Code for drawing with hatch brush
            }
            else if (myBrush is LinearGradientBrush)
            {
                    //Code for drawing with linear gradient brush
            }
            else if (myBrush is PathGradientBrush)
            {
                    //Code for drawing with path gradient brush
            }
        }

Иногда линия myBrush.Clone() бросает ArgumentException, Я искал ссылку MSDN для метода SolidBrush.Clone(), но нет никакой информации о каком-либо исключении SolidBrush.Clone

Итак, я проверил исходный код для этого метода в следующей ссылке Ссылочный код для класса SolidBrush

Код, используемый в System.Drawing.SolidBrush.Clone метод

public override object Clone() 
        {
            IntPtr cloneBrush = IntPtr.Zero;

            int status = SafeNativeMethods.Gdip.GdipCloneBrush(new HandleRef(this, this.NativeBrush), out cloneBrush);

            if (status != SafeNativeMethods.Gdip.Ok)
                throw SafeNativeMethods.Gdip.StatusException(status);

            // We intentionally lose the "immutable" bit.

            return new SolidBrush(cloneBrush);
        }

Понятно, что Clone Метод может генерировать исключение, но я не могу определить, когда и почему он будет генерировать исключение, так как этот код не мой.

Кто-нибудь знает, когда или почему будет выброшено исключение этим методом?

Редактировать:

Прикрепленное изображение, показывающее детали исключения

Исключение изображения

Кроме того, это не системная кисть, потому что immutable свойство кисти false

Не системная кисть

1 ответ

Решение

Вы можете определить, действительно ли это Clone() это исключение или избавление. Если вы попытаетесь удалить или изменить SystemBrush, произойдет исключение:

SystemBrushes.Control.Dispose(); // ArgumentException: Changes cannot be made to Brush because permissions are not valid.

Но клонирование, а затем удаление его работает нормально:

((Brush) SystemBrushes.Control.Clone()).Dispose(); // OK

Так что, возможно, просто избегать Clone в целом, если вы думаете, что это проблема, например:

    // instead of using clone, just make a new instance
    Brush myBrush = SystemBrushes.Control;
    if (myBrush is SolidBrush) {
        using (var nb = new SolidBrush(((SolidBrush) myBrush).Color)) {
            // ...
        }
    }
Другие вопросы по тегам