37 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			37 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using Mono.Cecil; | ||
|  | 
 | ||
|  | namespace Unity.Jobs.CodeGen | ||
|  | { | ||
|  |     static class TypeReferenceExtensions | ||
|  |     { | ||
|  |         public static TypeDefinition CheckedResolve(this TypeReference typeReference) | ||
|  |         { | ||
|  |             return typeReference.Resolve() ?? throw new ResolutionException(typeReference); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     static class MethodReferenceExtensions | ||
|  |     { | ||
|  |         /// <summary> | ||
|  |         /// Generates a closed/specialized MethodReference for the given method and types[] | ||
|  |         /// e.g. | ||
|  |         /// struct Foo { T Bar<T>(T val) { return default(T); } | ||
|  |         /// | ||
|  |         /// In this case, if one would like a reference to "Foo::int Bar(int val)" this method will construct such a method | ||
|  |         /// reference when provided the open "T Bar(T val)" method reference and the TypeReferences to the types you'd like | ||
|  |         /// specified as generic arguments (in this case a TypeReference to "int" would be passed in). | ||
|  |         /// </summary> | ||
|  |         /// <param name="method"></param> | ||
|  |         /// <param name="types"></param> | ||
|  |         /// <returns></returns> | ||
|  |         public static MethodReference MakeGenericInstanceMethod(this MethodReference method, | ||
|  |             params TypeReference[] types) | ||
|  |         { | ||
|  |             var result = new GenericInstanceMethod(method); | ||
|  |             foreach (var type in types) | ||
|  |                 result.GenericArguments.Add(type); | ||
|  |             return result; | ||
|  |         } | ||
|  |     } | ||
|  | } |