rj-action-library/Runtime/Tools/ReflectionHelper.cs

262 lines
5.8 KiB
C#

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<Assembly>();
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<FieldInfo> GetFieldInfosOfType<T>( object instance ) where T:class
{
var type = instance.GetType();
var fields = type.GetFields();
var list = new List<FieldInfo>();
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<T> GetFieldValuesOfType<T>( object instance ) where T:class
{
var type = instance.GetType();
var fields = type.GetFields();
var list = new List<T>();
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<C,T>( System.Action<System.Reflection.FieldInfo> action )
{
GetFields<T>( typeof( C ), action );
}
public static void GetFields<T>( System.Type c, System.Action<System.Reflection.FieldInfo> 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 );
}
}
}
}