|
Use Reflection To Generate Complete Color Chart
In GDI+, for drawing any item we need to pick up a color for either creating a
brush or a pen. .NET framework has provided System.Drawing.Color structure
which contains 141 colors. That makes life pretty easy. But there are
some developers like me who have hard time corelating the color names with what
actually they look like.
To solve this probelm, we decided to come up with a chart that will display all
the colors along with the names used in Color structure. The crude
approach could have been that we use a huge switch statement with
each case representing the colors defined in the structure.
But there is a very nice approach that we took. .NET framework procides a very
powerful feature called Reflection. All the colors in System.Drawing.Color
structure are declared as public static properties. So the idea is
pretty simple.
-
Get
Type of System.Drawing.Color strcuture.
-
Call
GetProperties method on Type instance. Make sure
that you use the appropriate BindingFlags attribute to get only
the properties that are of interest. In our case we are only interested in public
static properties. Therefore we will use BindingFlags.Public,
BindingFlags.Static and BindingFlags.DeclaredOnly ORed
together. The purpose of specifying BindingFlags.DeclaredOnly attribute
is to get only the static properties that are declared only in
this class only. We are not interested in properties of any parent class or
structure.
-
Iterate through each item in
PropertyInfo array value returned by
GetProperties method. Call Name property on PropertyInfo
object to get the name of each color. And call GetValue method to
get the actual value of Color.
-
Rest is just implementation detail and book keeping on how to arrange all the
colors on the bitmap and display it as a chart.
The complete code is attached with the article. Take a look at it for details.
Color testColor = Color.AliceBlue;
Type colorType = testColor.GetType();
if (null != colorType)
{
PropertyInfo[] propInfoList =
colorType.GetProperties(BindingFlags.Static|BindingFlags.DeclaredOnly|BindingFlags.Public);
int nNumProps = propInfoList.Length;
for (int i = 0; i < nNumRows; i++)
{
PropertyInfo propInfo = (PropertyInfo)propInfoList[nIdx];
Color color = (Color)propInfo.GetValue(null, null);
string strColorName = propInfo.Name;
}
}
Please feel free to send your suggestions directly to us at
softomatix@pardesiservices.com.
|