🎉 Celebrating 25 Years of GameDev.net! 🎉

Not many can claim 25 years on the Internet! Join us in celebrating this milestone. Learn more about our history, and thank you for being a part of our community!

C# Annoyances Issue 1: No Macros

Published August 24, 2007
Advertisement
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.
0 likes 2 comments

Comments

fanaticlatic
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
August 24, 2007 05:22 PM
Kwizatz
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.
August 25, 2007 10:53 PM
You must log in to join the conversation.
Don't have a GameDev.net account? Sign up!
Profile
Author
Advertisement
Advertisement