// MonoGame - Copyright (C) The MonoGame Team // This file is subject to the terms and conditions defined in // file 'LICENSE.txt', which is part of this source code package. using System; using System.Reflection; namespace MonoGame.Utilities { internal static partial class ReflectionHelpers { public static bool IsValueType(Type targetType) { if (targetType == null) { throw new NullReferenceException("Must supply the targetType parameter"); } #if NET45 return targetType.GetTypeInfo().IsValueType; #else return targetType.IsValueType; #endif } public static Type GetBaseType(Type targetType) { if (targetType == null) { throw new NullReferenceException("Must supply the targetType parameter"); } #if NET45 return targetType.GetTypeInfo().BaseType; #else return targetType.BaseType; #endif } /// /// Returns the Assembly of a Type /// public static Assembly GetAssembly(Type targetType) { if (targetType == null) { throw new NullReferenceException("Must supply the targetType parameter"); } #if NET45 return targetType.GetTypeInfo().Assembly; #else return targetType.Assembly; #endif } /// /// Returns true if the given type represents a non-object type that is not abstract. /// public static bool IsConcreteClass(Type t) { if (t == null) { throw new NullReferenceException("Must supply the t (type) parameter"); } if (t == typeof(object)) return false; #if NET45 var ti = t.GetTypeInfo(); if (ti.IsClass && !ti.IsAbstract) return true; #else if (t.IsClass && !t.IsAbstract) return true; #endif return false; } public static MethodInfo GetMethodInfo(Type type, string methodName) { #if NET45 return type.GetTypeInfo().GetDeclaredMethod(methodName); #else return type.GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance); #endif } public static MethodInfo GetPropertyGetMethod(PropertyInfo property) { if (property == null) { throw new NullReferenceException("Must supply the property parameter"); } #if NET45 return property.GetMethod; #else return property.GetGetMethod(); #endif } public static MethodInfo GetPropertySetMethod(PropertyInfo property) { if (property == null) { throw new NullReferenceException("Must supply the property parameter"); } #if NET45 return property.SetMethod; #else return property.GetSetMethod(); #endif } public static T GetCustomAttribute(MemberInfo member) where T : Attribute { if (member == null) throw new NullReferenceException("Must supply the member parameter"); #if NET45 return member.GetCustomAttribute(typeof(T)) as T; #else return Attribute.GetCustomAttribute(member, typeof(T)) as T; #endif } /// /// Returns true if the get method of the given property exist and are public. /// Note that we allow a getter-only property to be serialized (and deserialized), /// *if* CanDeserializeIntoExistingObject is true for the property type. /// public static bool PropertyIsPublic(PropertyInfo property) { if (property == null) { throw new NullReferenceException("Must supply the property parameter"); } var getMethod = GetPropertyGetMethod(property); if (getMethod == null || !getMethod.IsPublic) return false; return true; } /// /// Returns true if the given type can be assigned the given value /// public static bool IsAssignableFrom(Type type, object value) { if (type == null) throw new ArgumentNullException("type"); if (value == null) throw new ArgumentNullException("value"); return IsAssignableFromType(type, value.GetType()); } /// /// Returns true if the given type can be assigned a value with the given object type /// public static bool IsAssignableFromType(Type type, Type objectType) { if (type == null) throw new ArgumentNullException("type"); if (objectType == null) throw new ArgumentNullException("objectType"); #if NET45 if (type.GetTypeInfo().IsAssignableFrom(objectType.GetTypeInfo())) return true; #else if (type.IsAssignableFrom(objectType)) return true; #endif return false; } } }