using System.Collections; using System.Collections.Generic; using System; using System.Reflection; using System.Text.RegularExpressions; namespace Rokojori { public class ReflectionHelper { public static Type GetTypeByNameFromAssembly( string name, Assembly assembly ) { var type = assembly.GetType( name ); if ( type != null ) { return type; } var types = assembly.GetTypes(); var genericEndingRegex = @"`\d+$"; for ( int i = 0; i < types.Length; i++ ) { var typeName = types[ i ].Name; var isGeneric = Regex.IsMatch( typeName, genericEndingRegex ); if ( ! isGeneric ) { continue; } var typeNameWithoutGeneric = Regex.Replace( typeName, genericEndingRegex, "" ); if ( typeNameWithoutGeneric == name ) { return types[ i ]; } } return null; } public static Type GetTypeByName( string name ) { var assemblies = new List(); assemblies.AddRange( AppDomain.CurrentDomain.GetAssemblies() ); assemblies.Reverse(); var assembly = assemblies.Find( a => a.GetType( name ) != null ); return assembly == null ? null : assembly.GetType( name ); } public static bool IsList( Type type ) { if ( ! ( type.IsGenericType ) ) { return false; } return type.GetGenericTypeDefinition().IsAssignableFrom( typeof( List<> ) ); } public static bool IsList( object objectValue ) { if ( objectValue == null ) { return false; } if ( ! ( objectValue is IList ) ) { return false; } return IsList( objectValue.GetType() ); } public static bool IsDictionary( Type type ) { if ( ! ( type.IsGenericType ) ) { return false; } return type.GetGenericTypeDefinition().IsAssignableFrom( typeof( Dictionary<,> ) ); } public static bool IsDictionary( object objectValue ) { if ( objectValue == null ) { return false; } if ( ! ( objectValue is IDictionary ) ) { return false; } return IsDictionary( objectValue.GetType() ); } public static string GetMemberName( object obj, object member ) { if ( obj == null || member == null ) { return null; } var type = obj.GetType(); var fields = type.GetFields(); for ( int i = 0; i < fields.Length; i++ ) { var value = fields[ i ].GetValue( obj ); if ( value == member ) { return fields[ i ].Name; } } return null; } public static List GetFieldInfosOfType( object instance ) where T:class { var type = instance.GetType(); var fields = type.GetFields(); var list = new List(); for ( int i = 0; i < fields.Length; i++ ) { var value = fields[ i ].GetValue( instance ); var tValue = value as T; if ( tValue != null ) { list.Add( fields[ i ] ); } } return list; } public static List GetFieldValuesOfType( object instance ) where T:class { var type = instance.GetType(); var fields = type.GetFields(); var list = new List(); for ( int i = 0; i < fields.Length; i++ ) { var value = fields[ i ].GetValue( instance ); var tValue = value as T; if ( tValue != null ) { list.Add( tValue ); } } return list; } public static void GetFields( System.Action action ) { GetFields( typeof( C ), action ); } public static void GetFields( System.Type c, System.Action action ) { var fields = c.GetFields(); foreach( var f in fields ) { if ( f.FieldType == typeof( T ) ) { action( f ); } } } public static FieldInfo GetFieldInfo( object instance, string memberName ) { var type = instance.GetType(); var fields = type.GetFields(); var index = -1; for ( int i = 0; i < fields.Length; i++ ) { if ( fields[ i ].Name == memberName ) { index = i; } } return index == -1 ? null : fields[ index ]; } public static bool HasMember( object instance, string memberName ) { return GetFieldInfo( instance, memberName ) != null; } public static object GetMemberValue( object instance, string memberName ) { try { var field = ReflectionHelper.GetFieldInfo( instance, memberName ); if ( field == null ) { RJLog.Log(instance, "GetValue: member not found with name ", "'" + memberName + "'" ); return null; } return field.GetValue( instance ); } catch( System.Exception e ) { RJLog.Log(e ); } return null; } public static void SetMemberValue( object instance, string memberName, object value ) { try { var field = ReflectionHelper.GetFieldInfo( instance, memberName ); if ( field == null ) { RJLog.Log(instance, "SetValue: member not found with name ", "'" + memberName + "'" ); return; } field.SetValue( instance, value ); } catch( System.Exception e ) { RJLog.Log(e ); } } } }