Jump to content

  • Log In with Google      Sign In   
  • Create Account






C# Annoyances Issue 1: No Macros

Posted by Kwizatz, 24 August 2007 · 109 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.

Recent Entries

Recent Comments

PARTNERS