diff --git a/Nuclex.Support (Xbox 360).csproj b/Nuclex.Support (Xbox 360).csproj
index 185726f..987b411 100644
--- a/Nuclex.Support (Xbox 360).csproj
+++ b/Nuclex.Support (Xbox 360).csproj
@@ -134,6 +134,10 @@
ReverseComparer.cs
+
+
+ EnumHelper.cs
+
PrototypeFactory.cs
diff --git a/Nuclex.Support.csproj b/Nuclex.Support.csproj
index d5a896c..a2affe1 100644
--- a/Nuclex.Support.csproj
+++ b/Nuclex.Support.csproj
@@ -120,6 +120,10 @@
ReverseComparer.cs
+
+
+ EnumHelper.cs
+
PrototypeFactory.cs
diff --git a/Source/EnumHelper.Test.cs b/Source/EnumHelper.Test.cs
new file mode 100644
index 0000000..5b45212
--- /dev/null
+++ b/Source/EnumHelper.Test.cs
@@ -0,0 +1,149 @@
+#region CPL License
+/*
+Nuclex Framework
+Copyright (C) 2002-2009 Nuclex Development Labs
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the IBM Common Public License as
+published by the IBM Corporation; either version 1.0 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+IBM Common Public License for more details.
+
+You should have received a copy of the IBM Common Public
+License along with this library
+*/
+#endregion
+
+#if UNITTEST
+
+using System;
+using System.IO;
+
+using NUnit.Framework;
+
+namespace Nuclex.Support {
+
+ /// Unit Test for the enumeration helper class
+ [TestFixture]
+ public class EnumHelperTest {
+
+ #region enum TestEnumeration
+
+ /// An enumeration used for unit testing
+ internal enum TestEnumeration {
+ /// First arbitrary enumeration value
+ One = -2,
+ /// Third arbitrary enumeration value
+ Three = 33,
+ /// Second arbitrary enumeration value
+ Two = 23
+ }
+
+ #endregion // enum TestEnumeration
+
+ #region enum EmptyEnumeration
+
+ internal enum EmptyEnumeration { }
+
+ #endregion // enum EmptyEnumeration
+
+ ///
+ /// Verifies that the enum helper can list the members of an enumeration
+ /// manually (as it needs to be done on the XBox 360)
+ ///
+ [Test]
+ public void TestGetValuesXbox360() {
+ CollectionAssert.AreEquivalent(
+ new TestEnumeration[] {
+ TestEnumeration.One, TestEnumeration.Two, TestEnumeration.Three
+ },
+ EnumHelper.GetValuesXbox360()
+ );
+ }
+
+ ///
+ /// Verifies that the enum helper can list the members of an enumeration
+ ///
+ [Test]
+ public void TestGetValues() {
+ CollectionAssert.AreEquivalent(
+ new TestEnumeration[] {
+ TestEnumeration.One, TestEnumeration.Two, TestEnumeration.Three
+ },
+ EnumHelper.GetValues()
+ );
+ }
+
+ ///
+ /// Verifies that the enum helper can locate the highest value in an enumeration
+ ///
+ [Test]
+ public void TestGetHighestValue() {
+ Assert.AreEqual(
+ TestEnumeration.Three, EnumHelper.GetHighestValue()
+ );
+ }
+
+ ///
+ /// Verifies that the enum helper can locate the lowest value in an enumeration
+ ///
+ [Test]
+ public void TestGetLowestValue() {
+ Assert.AreEqual(
+ TestEnumeration.One, EnumHelper.GetLowestValue()
+ );
+ }
+
+ ///
+ /// Tests whether an exception is thrown if the GetValuesXbox360() method is
+ /// used on a non-enumeration type
+ ///
+ [Test]
+ public void TestThrowOnNonEnumTypeXbox360() {
+ Assert.Throws(
+ delegate() { EnumHelper.GetValuesXbox360(); }
+ );
+ }
+
+ ///
+ /// Tests whether an exception is thrown if the GetValues() method is used on
+ /// a non-enumeration type
+ ///
+ [Test]
+ public void TestThrowOnNonEnumType() {
+ Assert.Throws(
+ delegate() { EnumHelper.GetValues(); }
+ );
+ }
+
+ ///
+ /// Verifies that the default value for an enumeration is returned if
+ /// the GetLowestValue() method is used on an empty enumeration
+ ///
+ [Test]
+ public void TestLowestValueInEmptyEnumeration() {
+ Assert.AreEqual(
+ default(EmptyEnumeration), EnumHelper.GetLowestValue()
+ );
+ }
+
+ ///
+ /// Verifies that the default value for an enumeration is returned if
+ /// the GetHighestValue() method is used on an empty enumeration
+ ///
+ [Test]
+ public void TestHighestValueInEmptyEnumeration() {
+ Assert.AreEqual(
+ default(EmptyEnumeration), EnumHelper.GetHighestValue()
+ );
+ }
+
+ }
+
+} // namespace Nuclex.Support
+
+#endif // UNITTEST
diff --git a/Source/EnumHelper.cs b/Source/EnumHelper.cs
new file mode 100644
index 0000000..98e56dc
--- /dev/null
+++ b/Source/EnumHelper.cs
@@ -0,0 +1,126 @@
+#region CPL License
+/*
+Nuclex Framework
+Copyright (C) 2002-2009 Nuclex Development Labs
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the IBM Common Public License as
+published by the IBM Corporation; either version 1.0 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+IBM Common Public License for more details.
+
+You should have received a copy of the IBM Common Public
+License along with this library
+*/
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Reflection;
+
+namespace Nuclex.Support {
+
+ /// Helper methods for enumerations
+ public static class EnumHelper {
+
+ /// Returns the highest value encountered in an enumeration
+ ///
+ /// Enumeration of which the highest value will be returned
+ ///
+ /// The highest value in the enumeration
+ public static EnumType GetHighestValue() where EnumType : IComparable {
+ EnumType[] values = GetValues();
+
+ // If the enumeration is empty, return nothing
+ if(values.Length == 0) {
+ return default(EnumType);
+ }
+
+ // Look for the highest value in the enumeration. We initialize the highest value
+ // to the first enumeration value so we don't have to use some arbitrary starting
+ // value which might actually appear in the enumeration.
+ EnumType highestValue = values[0];
+ for(int index = 1; index < values.Length; ++index) {
+ if(values[index].CompareTo(highestValue) > 0) {
+ highestValue = values[index];
+ }
+ }
+
+ return highestValue;
+ }
+
+ /// Returns the lowest value encountered in an enumeration
+ ///
+ /// Enumeration of which the lowest value will be returned
+ ///
+ /// The lowest value in the enumeration
+ public static EnumType GetLowestValue() where EnumType : IComparable {
+ EnumType[] values = GetValues();
+
+ // If the enumeration is empty, return nothing
+ if(values.Length == 0) {
+ return default(EnumType);
+ }
+
+ // Look for the lowest value in the enumeration. We initialize the lowest value
+ // to the first enumeration value so we don't have to use some arbitrary starting
+ // value which might actually appear in the enumeration.
+ EnumType lowest = values[0];
+ for(int index = 1; index < values.Length; ++index) {
+ if(values[index].CompareTo(lowest) < 0) {
+ lowest = values[index];
+ }
+ }
+
+ return lowest;
+ }
+
+ /// Retrieves a list of all values contained in an enumeration
+ ///
+ /// Type of the enumeration whose values will be returned
+ ///
+ /// All values contained in the specified enumeration
+ public static EnumType[] GetValues() {
+#if XBOX360
+ return GetValuesXbox360();
+#else
+ return (EnumType[])Enum.GetValues(typeof(EnumType));
+#endif
+ }
+
+ /// Retrieves a list of all values contained in an enumeration
+ ///
+ /// Type of the enumeration whose values will be returned
+ ///
+ /// All values contained in the specified enumeration
+ internal static EnumType[] GetValuesXbox360() {
+ Type enumType = typeof(EnumType);
+ if(!enumType.IsEnum) {
+ throw new ArgumentException(
+ "The provided type needs to be an enumeration", "EnumType"
+ );
+ }
+
+ // Use reflection to get all fields in the enumeration
+ FieldInfo[] fieldInfos = enumType.GetFields(
+ BindingFlags.Public | BindingFlags.Static
+ );
+
+ // Create an array to hold the enumeration value and copy them over from
+ // the fields we just retrieved
+ EnumType[] values = new EnumType[fieldInfos.Length];
+ for(int index = 0; index < fieldInfos.Length; ++index) {
+ values[index] = (EnumType)fieldInfos[index].GetValue(null);
+ }
+
+ return values;
+ }
+
+ }
+
+} // namespace Nuclex.Support
\ No newline at end of file