#region License // Copyright 2006 James Newton-King // http://www.newtonsoft.com // // This work is licensed under the Creative Commons Attribution 2.5 License // http://creativecommons.org/licenses/by/2.5/ // // You are free: // * to copy, distribute, display, and perform the work // * to make derivative works // * to make commercial use of the work // // Under the following conditions: // * You must attribute the work in the manner specified by the author or licensor: // - If you find this component useful a link to http://www.newtonsoft.com would be appreciated. // * For any reuse or distribution, you must make clear to others the license terms of this work. // * Any of these conditions can be waived if you get permission from the copyright holder. #endregion using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Collections; using System.ComponentModel; namespace MySpace.Common.IO.JSON.Utilities { internal static class ReflectionUtils { public static T Convert<T>(object initialValue) { Type targetType = typeof(T); Type initialType = (initialValue != null) ? initialValue.GetType() : null; TypeConverter converter = TypeDescriptor.GetConverter(targetType); if (converter == null || !converter.CanConvertFrom(initialType)) throw new ApplicationException(string.Format("Could not convert from {0} to {1}", initialType, targetType)); return (T)converter.ConvertFrom(initialValue); } } }
Reflection
Is it a SubClass for another class
#region License // Copyright 2006 James Newton-King // http://www.newtonsoft.com // // This work is licensed under the Creative Commons Attribution 2.5 License // http://creativecommons.org/licenses/by/2.5/ // // You are free: // * to copy, distribute, display, and perform the work // * to make derivative works // * to make commercial use of the work // // Under the following conditions: // * You must attribute the work in the manner specified by the author or licensor: // - If you find this component useful a link to http://www.newtonsoft.com would be appreciated. // * For any reuse or distribution, you must make clear to others the license terms of this work. // * Any of these conditions can be waived if you get permission from the copyright holder. #endregion using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Collections; using System.ComponentModel; namespace MySpace.Common.IO.JSON.Utilities { internal static class ReflectionUtils { public static bool IsSubClass(Type type, Type check) { if (type == null || check == null) return false; if (type == check && type.IsGenericType) return true; if (check.IsInterface) { foreach (Type t in type.GetInterfaces()) { if (IsSubClass(t, check)) return true; } } if (type.IsGenericType && !type.IsGenericTypeDefinition) { if (IsSubClass(type.GetGenericTypeDefinition(), check)) return true; } return IsSubClass(type.BaseType, check); } } }
Is Object Unitialized Value
#region License // Copyright 2006 James Newton-King // http://www.newtonsoft.com // // This work is licensed under the Creative Commons Attribution 2.5 License // http://creativecommons.org/licenses/by/2.5/ // // You are free: // * to copy, distribute, display, and perform the work // * to make derivative works // * to make commercial use of the work // // Under the following conditions: // * You must attribute the work in the manner specified by the author or licensor: // - If you find this component useful a link to http://www.newtonsoft.com would be appreciated. // * For any reuse or distribution, you must make clear to others the license terms of this work. // * Any of these conditions can be waived if you get permission from the copyright holder. #endregion using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Collections; using System.ComponentModel; namespace MySpace.Common.IO.JSON.Utilities { internal static class ReflectionUtils { private static bool IsValueTypeUnitializedValue(ValueType value, Type valueType) { if (valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(Nullable<>)) return (value == null); else return value.Equals((ValueType)Activator.CreateInstance(valueType)); } public static bool IsObjectUnitializedValue(object value, Type valueType) { if (valueType.IsValueType) return IsValueTypeUnitializedValue((ValueType)value, valueType); else if (valueType.IsClass) return (value == null); else throw new ArgumentException("Type is neither a ValueType or a Class", "valueType"); } } }
Get Type Unitialized Value
#region License // Copyright 2006 James Newton-King // http://www.newtonsoft.com // // This work is licensed under the Creative Commons Attribution 2.5 License // http://creativecommons.org/licenses/by/2.5/ // // You are free: // * to copy, distribute, display, and perform the work // * to make derivative works // * to make commercial use of the work // // Under the following conditions: // * You must attribute the work in the manner specified by the author or licensor: // - If you find this component useful a link to http://www.newtonsoft.com would be appreciated. // * For any reuse or distribution, you must make clear to others the license terms of this work. // * Any of these conditions can be waived if you get permission from the copyright holder. #endregion using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Collections; using System.ComponentModel; namespace MySpace.Common.IO.JSON.Utilities { internal static class ReflectionUtils { public static object GetTypeUnitializedValue(Type type) { if (type.IsValueType) return Activator.CreateInstance(type); else if (type.IsClass) return null; else throw new ArgumentException("Type is neither a ValueType or a Class", "type"); } } }
Is Value Type Unitialized Value
#region License // Copyright 2006 James Newton-King // http://www.newtonsoft.com // // This work is licensed under the Creative Commons Attribution 2.5 License // http://creativecommons.org/licenses/by/2.5/ // // You are free: // * to copy, distribute, display, and perform the work // * to make derivative works // * to make commercial use of the work // // Under the following conditions: // * You must attribute the work in the manner specified by the author or licensor: // - If you find this component useful a link to http://www.newtonsoft.com would be appreciated. // * For any reuse or distribution, you must make clear to others the license terms of this work. // * Any of these conditions can be waived if you get permission from the copyright holder. #endregion using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Collections; using System.ComponentModel; namespace MySpace.Common.IO.JSON.Utilities { internal static class ReflectionUtils { private static bool IsValueTypeUnitializedValue(ValueType value, Type valueType) { if (valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(Nullable<>)) return (value == null); else return value.Equals((ValueType)Activator.CreateInstance(valueType)); } } }
Is it a Nullable Type
#region License // Copyright 2006 James Newton-King // http://www.newtonsoft.com // // This work is licensed under the Creative Commons Attribution 2.5 License // http://creativecommons.org/licenses/by/2.5/ // // You are free: // * to copy, distribute, display, and perform the work // * to make derivative works // * to make commercial use of the work // // Under the following conditions: // * You must attribute the work in the manner specified by the author or licensor: // - If you find this component useful a link to http://www.newtonsoft.com would be appreciated. // * For any reuse or distribution, you must make clear to others the license terms of this work. // * Any of these conditions can be waived if you get permission from the copyright holder. #endregion using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Collections; using System.ComponentModel; namespace MySpace.Common.IO.JSON.Utilities { internal static class ReflectionUtils { public static bool IsNullableType(Type underlyingType) { if (underlyingType.IsValueType) { if (!underlyingType.IsGenericType && typeof(Nullable<>).IsAssignableFrom(underlyingType)) return false; } return true; } } }
Does a given Type have a Default Constructor
#region License // Copyright 2006 James Newton-King // http://www.newtonsoft.com // // This work is licensed under the Creative Commons Attribution 2.5 License // http://creativecommons.org/licenses/by/2.5/ // // You are free: // * to copy, distribute, display, and perform the work // * to make derivative works // * to make commercial use of the work // // Under the following conditions: // * You must attribute the work in the manner specified by the author or licensor: // - If you find this component useful a link to http://www.newtonsoft.com would be appreciated. // * For any reuse or distribution, you must make clear to others the license terms of this work. // * Any of these conditions can be waived if you get permission from the copyright holder. #endregion using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Collections; using System.ComponentModel; namespace MySpace.Common.IO.JSON.Utilities { internal static class ReflectionUtils { public static bool HasDefaultConstructor(Type t) { if (t == null) throw new ArgumentNullException("t"); return (t.GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, new Type[0], null) != null); } } }