diff --git a/Nuclex.Support (net-4.0).csproj b/Nuclex.Support (net-4.0).csproj
index 38771f8..36d30b0 100644
--- a/Nuclex.Support (net-4.0).csproj
+++ b/Nuclex.Support (net-4.0).csproj
@@ -279,7 +279,7 @@
- \TypeHelper.cs
+ TypeHelper.cs
diff --git a/Nuclex.Support (xna-4.0-phone7).csproj b/Nuclex.Support (xna-4.0-phone7).csproj
index 27676ea..b6d1d9f 100644
--- a/Nuclex.Support (xna-4.0-phone7).csproj
+++ b/Nuclex.Support (xna-4.0-phone7).csproj
@@ -310,7 +310,7 @@
- \TypeHelper.cs
+ TypeHelper.cs
diff --git a/Nuclex.Support (xna-4.0-xbox360).csproj b/Nuclex.Support (xna-4.0-xbox360).csproj
index 44ac1db..b20a931 100644
--- a/Nuclex.Support (xna-4.0-xbox360).csproj
+++ b/Nuclex.Support (xna-4.0-xbox360).csproj
@@ -321,7 +321,7 @@
- \TypeHelper.cs
+ TypeHelper.cs
diff --git a/Source/Collections/Pool.cs b/Source/Collections/Pool.cs
index 1fd151a..d7c72aa 100644
--- a/Source/Collections/Pool.cs
+++ b/Source/Collections/Pool.cs
@@ -166,7 +166,9 @@ namespace Nuclex.Support.Collections {
/// Required because the Queue class doesn't allow this value to be retrieved
///
private int capacity;
+ /// Delegate used to create new instances of the pool's type
private Func createNewDelegate;
+ /// Delegate used to recycle instances
private Action recycleDelegate;
}
diff --git a/Source/TypeHelper.cs b/Source/TypeHelper.cs
index 4601898..0ceee0f 100644
--- a/Source/TypeHelper.cs
+++ b/Source/TypeHelper.cs
@@ -27,6 +27,8 @@ namespace Nuclex.Support {
/// Helper methods for the reflection Type class
public static class TypeHelper {
+#if !(XBOX360 || WINDOWS_PHONE)
+
#region class MemberInfoComparer
/// Determines whether member informations relate to the same member
@@ -58,60 +60,6 @@ namespace Nuclex.Support {
#endregion // class MemberInfoComparer
- /// Determines whether the given type has a default constructor
- /// Type which is to be checked
- /// True if the type has a default constructor
- public static bool HasDefaultConstructor(this Type type) {
- ConstructorInfo[] constructors = type.GetConstructors();
-
- for(int index = 0; index < constructors.Length; ++index) {
- ConstructorInfo constructor = constructors[index];
- if(constructor.IsPublic && (constructor.GetParameters().Length == 0)) {
- return true;
- }
- }
-
- return false;
- }
-
-#if XBOX || WINDOWS_PHONE
- ///
- /// Returns all the fields of a type, including those defined in the type's base classes
- ///
- /// Type whose fields will be returned
- /// Binding flags to use when querying the fields
- /// All of the type's fields, including its base types
- public static FieldInfo[] GetFieldInfosIncludingBaseClasses(
- this Type type, BindingFlags bindingFlags
- ) {
- FieldInfo[] fieldInfos = type.GetFields(bindingFlags);
-
- // If this class doesn't have a base, don't waste any time
- if(type.BaseType != typeof(object)) {
- var fieldInfoSet = new Dictionary(MemberInfoComparer.Default);
- for(int index = 0; index < fieldInfos.Length; ++index) {
- fieldInfoSet.Add(fieldInfos[index], null);
- }
-
- while(type.BaseType != typeof(object)) {
- type = type.BaseType;
- fieldInfos = type.GetFields(bindingFlags);
-
- for(int index = 0; index < fieldInfos.Length; ++index) {
- FieldInfo fieldInfo = fieldInfos[index];
- if(!fieldInfoSet.ContainsKey(fieldInfo)) {
- fieldInfoSet.Add(fieldInfo, null);
- }
- }
- }
-
- fieldInfos = new FieldInfo[fieldInfoSet.Count];
- fieldInfoSet.Keys.CopyTo(fieldInfos, 0);
- }
-
- return fieldInfos;
- }
-#else
///
/// Returns all the fields of a type, including those defined in the type's base classes
///
@@ -140,7 +88,84 @@ namespace Nuclex.Support {
return fieldInfos;
}
-#endif
+
+#else // !(XBOX360 || WINDOWS_PHONE)
+
+ ///
+ /// Returns all the fields of a type, including those defined in the type's base classes
+ ///
+ /// Type whose fields will be returned
+ /// Binding flags to use when querying the fields
+ /// All of the type's fields, including its base types
+ public static FieldInfo[] GetFieldInfosIncludingBaseClasses(
+ this Type type, BindingFlags bindingFlags
+ ) {
+ FieldInfo[] fieldInfos = type.GetFields(bindingFlags);
+
+ // If this class doesn't have a base, don't waste any time
+ if(type.BaseType != typeof(object)) {
+ var fieldInfoList = new List(fieldInfos.Length * 2);
+ for(int index = 0; index < fieldInfos.Length; ++index) {
+ fieldInfoList.Add(fieldInfos[index]);
+ }
+
+ while(type.BaseType != typeof(object)) {
+ type = type.BaseType;
+ fieldInfos = type.GetFields(bindingFlags);
+
+ for(int index = 0; index < fieldInfos.Length; ++index) {
+ addIfNotExists(fieldInfoList, fieldInfos[index]);
+ }
+ }
+
+ fieldInfos = fieldInfoList.ToArray();
+ }
+
+ return fieldInfos;
+ }
+
+ ///
+ /// Adds field informations to a list if they're not already contained in it
+ ///
+ /// List the field informations will be added to
+ /// Field informations that will be added to the list
+ private static void addIfNotExists(IList fieldInfos, FieldInfo fieldInfo) {
+ bool matchFound = false;
+
+ for(int index = 0; index < fieldInfos.Count; ++index) {
+ FieldInfo current = fieldInfos[index];
+
+ matchFound =
+ (current.DeclaringType == fieldInfo.DeclaringType) &&
+ (current.Name == fieldInfo.Name);
+
+ if(matchFound) {
+ break;
+ }
+ }
+
+ if(!matchFound) {
+ fieldInfos.Add(fieldInfo);
+ }
+ }
+
+#endif // !(XBOX360 || WINDOWS_PHONE)
+
+ /// Determines whether the given type has a default constructor
+ /// Type which is to be checked
+ /// True if the type has a default constructor
+ public static bool HasDefaultConstructor(this Type type) {
+ ConstructorInfo[] constructors = type.GetConstructors();
+
+ for(int index = 0; index < constructors.Length; ++index) {
+ ConstructorInfo constructor = constructors[index];
+ if(constructor.IsPublic && (constructor.GetParameters().Length == 0)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
}