Code Analysis: How to Correctly Resolve CA1300 – "Specify MessageBox Options"

This is the first installment of what I hope to be many short bits of guidance about correctly resolving some of the more complex warnings coming out of FxCop and Code Analysis.

The CA1300 warning is specifically about the right-to-left or left-to-right reading order of a message box.  The documentation for the warning alludes that a message box doesn't automatically inherit the containing form's reading order or the reading order from the user's current culture.  Although, I can't find any documentation that confirms either.

In any case, this is a rather complex warning to resolve, you possibly have to traverse the form's lineage (when reading order is inherited) to find the reading order setting.  The example fix in the documentation basically puts this logic in the code that calls MessageBox.Show.  This is very un-resuable and couples the logic not only to the containing class but to the method it's contained within.  My solution attempts to allow resolution of CA1300 with as little coupling as possible and little or no changes to existing code.

My solution is obviously going to implement the extra logic in a new class; but I'll be implementing in a way where you don't have to change your existing calls to MessageBox.Show.  My resolution extends the Form class and provides a MessageBox property that is implemented with a protected nested class that provides Show methods with all the same signatures as System.Windows.Forms.MessageBox.Show.  The only requirement to using this class is that you haven't explicitly used the full namespace when calling MessageBox.Show, like 'System.Windows.Forms.MessageBox.Show("text", "caption")'.

The following is an example of code that generates the warning:

namespace WinFormApplication

{

    internal sealed partial class MainForm : Form

    {

        public MainForm ( )

        {

            InitializeComponent();

        }

 

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization",

            "CA1303:DoNotPassLiteralsAsLocalizedParameters",

            MessageId = "System.Windows.Forms.MessageBox.Show(System.String,System.String)")]

        private void button1_Click ( object sender, EventArgs e )

        {

            MessageBox.Show("text", "caption");

        }

    }

}

The following is the class that extends Form using a protected class to implement a MessageBox property to redirect calls to MessageBox.Show–which eventually creates the appopriate MessageBoxOptions value and delegates to System.Windows.Forms.MessageBox.Show.

namespace PRI.Windows.Forms

{

    public class RtlAwareForm : Form

    {

        private MessageBoxProxy messageBoxProxy;

 

        protected MessageBoxProxy MessageBox

        {

            get

            {

                return messageBoxProxy;

            }

        }

 

        public RtlAwareForm ( )

        {

            messageBoxProxy = new MessageBoxProxy(this);

        }

 

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",

            "CA1034:NestedTypesShouldNotBeVisible")]

        protected class MessageBoxProxy

        {

            private Control parent;

            public MessageBoxProxy (Control parent)

            {

                this.parent = parent;

            }

 

            private static Boolean IsRightToLeft ( Control control )

            {

                if (control.RightToLeft == RightToLeft.Inherit)

                {

                    Control parent = control.Parent;

                    while (parent != null)

                    {

                        if (parent.RightToLeft != RightToLeft.Inherit)

                        {

                            return parent.RightToLeft == RightToLeft.Yes;

                        }

                    }

                    return CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft;

                }

                else

                {

                    return control.RightToLeft == RightToLeft.Yes;

                }

            }

 

            public DialogResult Show ( string text )

            {

                return Show(text,

                    string.Empty,

                    MessageBoxButtons.OK,

                    MessageBoxIcon.None,

                    MessageBoxDefaultButton.Button1);

            }

 

            public DialogResult Show ( string text, string caption )

            {

                return Show(text,

                    caption,

                    MessageBoxButtons.OK,

                    MessageBoxIcon.None,

                    MessageBoxDefaultButton.Button1);

            }

 

            public DialogResult Show ( string text,

                string caption,

                MessageBoxButtons buttons )

            {

                return Show(text,

                    caption,

                    buttons,

                    MessageBoxIcon.None,

                    MessageBoxDefaultButton.Button1);

            }

 

            public DialogResult Show ( string text,

                string caption,

                MessageBoxButtons buttons,

                MessageBoxIcon icon )

            {

                return Show(text,

                    caption,

                    buttons,

                    icon,

                    MessageBoxDefaultButton.Button1);

            }

 

            public DialogResult Show ( String text,

                String caption,

                MessageBoxButtons messageBoxButtons,

                MessageBoxIcon icon,

                MessageBoxDefaultButton defaultButton )

            {

                MessageBoxOptions options =

                    IsRightToLeft(parent) ?

                        MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading : 0;

 

                return System.Windows.Forms.MessageBox.Show(parent,

                    text,

                    caption,

                    messageBoxButtons,

                    icon,

                    defaultButton,

                    options);

            }

 

            public DialogResult Show ( IWin32Window owner, string text )

            {

                return Show(owner,

                    text,

                    string.Empty,

                    MessageBoxButtons.OK,

                    MessageBoxIcon.None,

                    MessageBoxDefaultButton.Button1);

            }

 

            public DialogResult Show ( IWin32Window owner, string text, string caption )

            {

                return Show(owner,

                    text,

                    caption,

                    MessageBoxButtons.OK,

                    MessageBoxIcon.None,

                    MessageBoxDefaultButton.Button1);

            }

 

            public DialogResult Show ( IWin32Window owner,

                string text,

                string caption,

                MessageBoxButtons buttons )

            {

                return Show(owner,

                    text,

                    caption,

                    buttons,

                    MessageBoxIcon.None,

                    MessageBoxDefaultButton.Button1);

            }

 

            public DialogResult Show ( IWin32Window owner,

                string text,

                string caption,

                MessageBoxButtons buttons,

                MessageBoxIcon icon )

            {

                return Show(owner,

                    text,

                    caption,

                    buttons,

                    icon,

                    MessageBoxDefaultButton.Button1);

            }

 

            public DialogResult Show ( IWin32Window owner,

                string text,

                string caption,

                MessageBoxButtons buttons,

                MessageBoxIcon icon,

                MessageBoxDefaultButton defaultButton )

            {

                MessageBoxOptions options = parent != owner ?

                    0 : (IsRightToLeft(parent) ?

                        MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading : 0);

 

                return System.Windows.Forms.MessageBox.Show(owner,

                    text,

                    caption,

                    buttons,

                    icon,

                    defaultButton,

                    options);

            }

 

            public DialogResult Show ( string text,

                string caption, MessageBoxButtons buttons,

                MessageBoxIcon icon,

                MessageBoxDefaultButton defaultButton,

                MessageBoxOptions options )

            {

                return System.Windows.Forms.MessageBox.Show(parent,

                    text,

                    caption,

                    buttons,

                    icon,

                    defaultButton,

                    options);

            }

 

            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",

                "CA1822:MarkMembersAsStatic")]

            public DialogResult Show ( string text,

                string caption,

                MessageBoxButtons buttons,

                MessageBoxIcon icon,

                MessageBoxDefaultButton defaultButton,

                MessageBoxOptions options,

                bool displayHelpButton )

            {

                return System.Windows.Forms.MessageBox.Show(text,

                    caption,

                    buttons,

                    icon,

                    defaultButton,

                    options,

                    displayHelpButton);

            }

 

            public DialogResult Show ( string text,

                string caption,

                MessageBoxButtons buttons,

                MessageBoxIcon icon,

                MessageBoxDefaultButton defaultButton,

                MessageBoxOptions options,

                string helpFilePath )

            {

                return System.Windows.Forms.MessageBox.Show(parent,

                    text,

                    caption,

                    buttons,

                    icon,

                    defaultButton,

                    options,

                    helpFilePath);

            }

 

            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",

                "CA1822:MarkMembersAsStatic")]

            public DialogResult Show ( IWin32Window owner,

                string text,

                string caption,

                MessageBoxButtons buttons,

                MessageBoxIcon icon,

                MessageBoxDefaultButton defaultButton,

                MessageBoxOptions options )

            {

                return System.Windows.Forms.MessageBox.Show(owner,

                    text,

                    caption,

                    buttons,

                    icon,

                    defaultButton,

                    options);

            }

 

            public DialogResult Show ( string text,

                string caption,

                MessageBoxButtons buttons,

                MessageBoxIcon icon,

                MessageBoxDefaultButton defaultButton,

                MessageBoxOptions options,

                string helpFilePath,

                string keyword )

            {

                return System.Windows.Forms.MessageBox.Show(parent,

                    text,

                    caption,

                    buttons,

                    icon,

                    defaultButton,

                    options,

                    helpFilePath,

                    keyword);

            }

 

            public DialogResult Show ( string text,

                string caption,

                MessageBoxButtons buttons,

                MessageBoxIcon icon,

                MessageBoxDefaultButton defaultButton,

                MessageBoxOptions options,

                string helpFilePath,

                HelpNavigator navigator )

            {

                return System.Windows.Forms.MessageBox.Show(parent,

                    text,

                    caption,

                    buttons,

                    icon,

                    defaultButton,

                    options,

                    helpFilePath,

                    navigator);

            }

 

            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",

                "CA1822:MarkMembersAsStatic")]

            public DialogResult Show ( IWin32Window owner,

                string text,

                string caption,

                MessageBoxButtons buttons,

                MessageBoxIcon icon,

                MessageBoxDefaultButton defaultButton,

                MessageBoxOptions options,

                string helpFilePath )

            {

                return Show(owner,

                    text,

                    caption,

                    buttons,

                    icon,

                    defaultButton,

                    options,

                    helpFilePath);

            }

 

            public DialogResult Show ( string text,

                string caption,

                MessageBoxButtons buttons,

                MessageBoxIcon icon,

                MessageBoxDefaultButton defaultButton,

                MessageBoxOptions options,

                string helpFilePath,

                HelpNavigator navigator,

                object param )

            {

                return System.Windows.Forms.MessageBox.Show(parent,

                    text,

                    caption,

                    buttons,

                    icon,

                    defaultButton,

                    options,

                    helpFilePath,

                    navigator,

                    param);

            }

 

            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",

                "CA1822:MarkMembersAsStatic")]

            public DialogResult Show ( IWin32Window owner,

                string text,

                string caption,

                MessageBoxButtons buttons,

                MessageBoxIcon icon,

                MessageBoxDefaultButton defaultButton,

                MessageBoxOptions options,

                string helpFilePath,

                string keyword )

            {

                return System.Windows.Forms.MessageBox.Show(owner,

                    text,

                    caption,

                    buttons,

                    icon,

                    defaultButton,

                    options,

                    helpFilePath,

                    keyword);

            }

 

            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",

                "CA1822:MarkMembersAsStatic")]

            public DialogResult Show ( IWin32Window owner,

                string text,

                string caption,

                MessageBoxButtons buttons,

                MessageBoxIcon icon,

                MessageBoxDefaultButton defaultButton,

                MessageBoxOptions options,

                string helpFilePath,

                HelpNavigator navigator )

            {

                return System.Windows.Forms.MessageBox.Show(owner,

                    text,

                    caption,

                    buttons,

                    icon,

                    defaultButton,

                    options,

                    helpFilePath,

                    navigator);

            }

 

            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",

                "CA1822:MarkMembersAsStatic")]

            public DialogResult Show ( IWin32Window owner,

                string text,

                string caption,

                MessageBoxButtons buttons,

                MessageBoxIcon icon,

                MessageBoxDefaultButton defaultButton,

                MessageBoxOptions options,

                string helpFilePath,

                HelpNavigator navigator,

                object param )

            {

                return System.Windows.Forms.MessageBox.Show(owner,

                    text,

                    caption,

                    buttons,

                    icon,

                    defaultButton,

                    options,

                    helpFilePath,

                    navigator,

                    param);

            }

        }

    }

}

I've attached a non-web-site friendly version of the class in the attachements, that includes more comments and less line breaks. 

Now, the only change to the original code to resolve the warnings is the addition of a using namespace directive and a change to the form's base class (and in this example, a change to the CodeAnalysis suppression):

namespace WinFormApplication

{

    using PRI.Windows.Forms;

 

    internal sealed partial class MainForm : RtlAwareForm

    {

        public MainForm ( )

        {

            InitializeComponent();

        }

 

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization",

                "CA1303:DoNotPassLiteralsAsLocalizedParameters",

                MessageId = "PRI.Windows.Forms.RtlAwareForm+MessageBoxProxy.Show(System.String,System.String)")]

        private void button1_Click ( object sender, EventArgs e )

        {

            MessageBox.Show("text", "caption");

        }

    }

}

3 thoughts on “Code Analysis: How to Correctly Resolve CA1300 – "Specify MessageBox Options"”

  1. For those observant readers who noticed the Code Analysis suppression of CA1822. This appears to be no longer needed with Visual Studio 2008 (at least Beta 2, I haven’t tried previous releases of Orcas), it recognises those methods as implementations of an interface that must not be static and therefore no longer complains.

  2. hi,

    can i use this class without a forms inherits from this class

    cuz i have many many many forms, if i want to fix inherits to becomfrom this class i want to expense more one month in this operation

    plz f you have solution send me on my email

    salameh862005@yahoo.com

    best regards

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>