forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			63 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using FishNet.CodeGenerating.ILCore;
 | 
						|
using MonoFN.Cecil;
 | 
						|
using System;
 | 
						|
using System.Linq.Expressions;
 | 
						|
using System.Reflection;
 | 
						|
 | 
						|
namespace FishNet.CodeGenerating.Helping.Extension
 | 
						|
{
 | 
						|
 | 
						|
    public static class ModuleDefinitionExtensions
 | 
						|
    {
 | 
						|
        /// <summary>
 | 
						|
        /// Gets a class within a module.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="moduleDef"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static TypeDefinition GetClass(this ModuleDefinition moduleDef, string className, string namespaceName = "")
 | 
						|
        {
 | 
						|
            if (namespaceName.Length == 0)
 | 
						|
                namespaceName = FishNetILPP.RUNTIME_ASSEMBLY_NAME;
 | 
						|
            
 | 
						|
            return moduleDef.GetType(namespaceName, className);
 | 
						|
        }
 | 
						|
 | 
						|
        public static MethodReference ImportReference(this ModuleDefinition moduleDef, Expression<Action> expression)
 | 
						|
        {
 | 
						|
            return ImportReference(moduleDef, (LambdaExpression)expression);
 | 
						|
        }
 | 
						|
        public static MethodReference ImportReference<T>(this ModuleDefinition module, Expression<Action<T>> expression)
 | 
						|
        {
 | 
						|
            return ImportReference(module, (LambdaExpression)expression);
 | 
						|
        }
 | 
						|
 | 
						|
        public static MethodReference ImportReference(this ModuleDefinition module, LambdaExpression expression)
 | 
						|
        {
 | 
						|
            if (expression.Body is MethodCallExpression outermostExpression)
 | 
						|
            {
 | 
						|
                MethodInfo methodInfo = outermostExpression.Method;
 | 
						|
                return module.ImportReference(methodInfo);
 | 
						|
            }
 | 
						|
 | 
						|
            if (expression.Body is NewExpression newExpression)
 | 
						|
            {
 | 
						|
                ConstructorInfo methodInfo = newExpression.Constructor;
 | 
						|
                // constructor is null when creating an ArraySegment<object>
 | 
						|
                methodInfo = methodInfo ?? newExpression.Type.GetConstructors()[0];
 | 
						|
                return module.ImportReference(methodInfo);
 | 
						|
            }
 | 
						|
 | 
						|
            if (expression.Body is MemberExpression memberExpression)
 | 
						|
            {
 | 
						|
                var property = memberExpression.Member as PropertyInfo;
 | 
						|
                return module.ImportReference(property.GetMethod);
 | 
						|
            }
 | 
						|
 | 
						|
            throw new ArgumentException($"Invalid Expression {expression.Body.GetType()}");
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
} |