Files
LuaCsForBarotraumaEP/Libraries/MonoGame.Framework/Src/MonoGame.Framework/Utilities/ReflectionHelpers.cs
2019-06-25 16:00:44 +03:00

179 lines
5.3 KiB
C#

// 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
}
/// <summary>
/// Returns the Assembly of a Type
/// </summary>
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
}
/// <summary>
/// Returns true if the given type represents a non-object type that is not abstract.
/// </summary>
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<T>(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
}
/// <summary>
/// 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.
/// </summary>
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;
}
/// <summary>
/// Returns true if the given type can be assigned the given value
/// </summary>
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());
}
/// <summary>
/// Returns true if the given type can be assigned a value with the given object type
/// </summary>
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;
}
}
}