• entries
17
21
• views
17296

# C# Annoyances Issue 1: No Macros

312 views

C# has no macros, this was made on purpose, however, I found a place where I could really use them.

I am writing a "Settings" class that uses XML Serialization, I need to use System.Drawing.Color variables which apparently do not serialize "out of the box", so a proxy string setter/getter needs to be made, and so the class is written (this is for a level editor):

    public class Settings    {        private System.Drawing.Color gridPrimaryColor;        private System.Drawing.Color gridSecondaryColor;        private System.Drawing.Color gridTertiaryColor;        private System.Drawing.Color viewBackgroundColor;        [XmlIgnoreAttribute()]        public System.Drawing.Color GridPrimaryColor        {            set            {                gridPrimaryColor = value;            }            get            {                return gridPrimaryColor;            }        }        [XmlIgnoreAttribute()]        public System.Drawing.Color GridSecondaryColor        {            set            {                gridSecondaryColor = value;            }            get            {                return gridSecondaryColor;            }        }        [XmlIgnoreAttribute()]        public System.Drawing.Color GridTertiaryColor        {            set            {                gridTertiaryColor = value;            }            get            {                return gridTertiaryColor;            }        }        [XmlIgnoreAttribute()]        public System.Drawing.Color ViewBackgroundColor        {            set            {                viewBackgroundColor = value;            }            get            {                return viewBackgroundColor;            }        }        [XmlElement("GridPrimaryColor")]        public string HTMLGridPrimaryColor        {            set            {                gridPrimaryColor = ColorTranslator.FromHtml(value);            }            get            {                return ColorTranslator.ToHtml(gridPrimaryColor);            }        }        [XmlElement("GridSecondaryColor")]        public string HTMLGridSecondaryColor        {            set            {                gridSecondaryColor = ColorTranslator.FromHtml(value);            }            get            {                return gridSecondaryColor;            }        }        [XmlElement("GridTertiaryColor")]        public string HTMLGridTertiaryColor        {            set            {                gridTertiaryColor = ColorTranslator.FromHtml(value);            }            get            {                return gridTertiaryColor;            }        }        [XmlElement("ViewBackgroundColor")]        public string HTMLViewBackgroundColor        {            set            {                viewBackgroundColor = ColorTranslator.FromHtml(value);            }            get            {                return viewBackgroundColor;            }        }   }

Now thats a lot of code!, its there just to make a point, which is "there will be a lot of identically defined variables differing in name only".

Lets extract the code for a single variable:

        private System.Drawing.Color viewBackgroundColor;        [XmlIgnoreAttribute()]        public System.Drawing.Color ViewBackgroundColor        {            set            {                viewBackgroundColor = value;            }            get            {                return viewBackgroundColor;            }        }        [XmlElement("ViewBackgroundColor")]        public string HTMLViewBackgroundColor        {            set            {                viewBackgroundColor = ColorTranslator.FromHtml(value);            }            get            {                return viewBackgroundColor;            }        }

Now, thats what it takes to define a single property variable thats serializable, wouldn't you just love to have the power of macros and do this (backslashes removed because of formating):

#define XMLITEM(INTERNAL,EXTERNAL)         private System.Drawing.Color INTERNAL;         [XmlIgnoreAttribute()]         public System.Drawing.Color EXTERNAL         {             set             {                 INTERNAL = value;             }             get             {                 return INTERNAL;             }         }         [XmlElement("EXTERNAL")]         public string HTMLEXTERNAL         {             set             {                 INTERNAL = ColorTranslator.FromHtml(value);             }             get             {                 return INTERNAL;             }         }

and then just

    public class Settings    {        XMLITEM(gridPrimaryColor)        XMLITEM(gridSecondaryColor)        XMLITEM(gridTertiaryColor)        XMLITEM(viewBackgroundColor)    }

I would.

Macros are prone to abuse, but they do have their uses.

off the top of my head can you not serialize a class in c# like so:

[Serializable]
class someClass()
{
...
}

whether that would work for XML serialization i don't know suppose you could try:

[XMLSerializable]
class someClass()
{
...
}

just for kicks. seems daft that they make you go through so much trouble

I am a C# newbie coming from a C/C++ background, so I am not sure you completely have to go through all that, but from my Google research it seems so, apparently the problem stems from C# not being able or not having a default way to serialize binary variables.

I actually had to add the [Serializable] tag in order for the code to work, without it the xml items were written as having no data.