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()}");
 | |
|         }
 | |
| 
 | |
| 
 | |
|     }
 | |
| 
 | |
| 
 | |
| } |