Click here to Skip to main content
15,894,825 members
Articles / Programming Languages / C#

TypeBuilderLib, a Library to Build Dynamic Types Easily

Rate me:
Please Sign up or sign in to vote.
4.94/5 (13 votes)
23 Feb 2007CPOL11 min read 44K   243   41  
TypeBuilderLib allows you to create dynamic types on the fly, which can increase the productivity of developers and the performance of applications.
using System;

using NUnit.Framework;

using TypeBuilderLib.Converters;

namespace TypeBuilderLib.UnitTests.Converters
{
	[TestFixture(Description="Testing the enumerator converters")]
	public class EnumTest
	{
		#region Inner Types
		public enum Colour
		{
			Red,
			Green,
			[EnumFieldLabel("Light Gray")]
			LightGray,
			[EnumFieldLabel("Dark Blue")]
			DarkBlue
		}
		#endregion

		[Test]
		public void EnumToString()
		{
			ITypeConverter<string, Colour> converter = new EnumConverter<Colour>();

			Assert.AreEqual(Colour.Red, converter.ConvertForward(Colour.Red.ToString()));
			Assert.AreEqual(Colour.Green, converter.ConvertForward(Colour.Green.ToString()));
			Assert.AreEqual(Colour.LightGray, converter.ConvertForward("Light Gray"));
			Assert.AreEqual(Colour.DarkBlue, converter.ConvertForward("Dark Blue"));
		}

		[Test]
		public void StringToEnum()
		{
			ITypeConverter<string, Colour> converter = new EnumConverter<Colour>();

			Assert.AreEqual(Colour.Red.ToString(), converter.ConvertBackward(Colour.Red));
			Assert.AreEqual(Colour.Green.ToString(), converter.ConvertBackward(Colour.Green));
			Assert.AreEqual("Light Gray", converter.ConvertBackward(Colour.LightGray));
			Assert.AreEqual("Dark Blue", converter.ConvertBackward(Colour.DarkBlue));
		}

		[Test]
		public void NullableEnumToString()
		{
			ITypeConverter<string, Colour?> converter = new NullableEnumConverter<Colour>();

			Assert.AreEqual(Colour.Red, converter.ConvertForward(Colour.Red.ToString()));
			Assert.AreEqual(Colour.Green, converter.ConvertForward(Colour.Green.ToString()));
			Assert.AreEqual(Colour.LightGray, converter.ConvertForward("Light Gray"));
			Assert.AreEqual(Colour.DarkBlue, converter.ConvertForward("Dark Blue"));
			Assert.AreEqual(new Colour?(), converter.ConvertForward(""));
			Assert.AreEqual(new Colour?(), converter.ConvertForward(null));
		}

		[Test]
		public void StringToNullableEnum()
		{
			ITypeConverter<string, Colour?> converter = new NullableEnumConverter<Colour>();

			Assert.AreEqual(Colour.Red.ToString(), converter.ConvertBackward(Colour.Red));
			Assert.AreEqual(Colour.Green.ToString(), converter.ConvertBackward(Colour.Green));
			Assert.AreEqual("Light Gray", converter.ConvertBackward(Colour.LightGray));
			Assert.AreEqual("Dark Blue", converter.ConvertBackward(Colour.DarkBlue));
			Assert.AreEqual("", converter.ConvertBackward(new Colour?()));
		}

		[Test]
		public void SpaceTest()
		{
			TypeConverterAttribute att = new TypeConverterAttribute(typeof(EnumConverter<Colour>));

			Assert.IsNotNull(att.TypeConverterType);

			att.ValidateTypeConverterType(typeof(string), typeof(Colour));

			ITypeConverter<string, Colour> converter =
				(ITypeConverter<string, Colour>)Activator.CreateInstance(att.TypeConverterType);

			Assert.AreEqual(Colour.Red, converter.ConvertForward(Colour.Red.ToString()));
			Assert.AreEqual(Colour.Green, converter.ConvertForward(Colour.Green.ToString()));
			Assert.AreEqual(Colour.LightGray, converter.ConvertForward("Light Gray"));
			Assert.AreEqual(Colour.DarkBlue, converter.ConvertForward("Dark Blue"));

			Assert.AreEqual(Colour.Red.ToString(), converter.ConvertBackward(Colour.Red));
			Assert.AreEqual(Colour.Green.ToString(), converter.ConvertBackward(Colour.Green));
			Assert.AreEqual("Light Gray", converter.ConvertBackward(Colour.LightGray));
			Assert.AreEqual("Dark Blue", converter.ConvertBackward(Colour.DarkBlue));
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect CGI
Canada Canada
Vincent-Philippe is a Senior Solution Architect working in Montreal (Quebec, Canada).

His main interests are Windows Azure, .NET Enterprise suite (e.g. SharePoint 2013, Biztalk Server 2010) & the new .NET 4.5 platforms.

Comments and Discussions