File: MethodReferenceExtensions.cs
Web Access
Project: src\src\Controls\src\Build.Tasks\Controls.Build.Tasks.csproj (Microsoft.Maui.Controls.Build.Tasks)
using System;
using Mono.Cecil;
 
namespace Microsoft.Maui.Controls.Build.Tasks
{
	static class MethodReferenceExtensions
	{
		public static MethodReference ResolveGenericParameters(this MethodReference self, TypeReference declaringTypeRef,
			ModuleDefinition module)
		{
			if (self == null)
				throw new ArgumentNullException(nameof(self));
			if (declaringTypeRef == null)
				throw new ArgumentNullException(nameof(declaringTypeRef));
 
			var reference = new MethodReference(self.Name, ImportUnresolvedType(self.ReturnType, module))
			{
				DeclaringType = declaringTypeRef,
				HasThis = self.HasThis,
				ExplicitThis = self.ExplicitThis,
				CallingConvention = self.CallingConvention
			};
 
			foreach (var parameter in self.Parameters)
			{
				var definition = new ParameterDefinition(ImportUnresolvedType(parameter.ParameterType, module));
 
				foreach (var attribute in parameter.CustomAttributes)
					definition.CustomAttributes.Add(attribute);
 
				reference.Parameters.Add(definition);
			}
 
			foreach (var generic_parameter in self.GenericParameters)
				reference.GenericParameters.Add(new GenericParameter(generic_parameter.Name, reference));
 
			return reference;
		}
 
		static TypeReference ImportUnresolvedType(TypeReference type, ModuleDefinition module)
		{
			if (type.IsGenericParameter)
				return type;
 
			var generictype = type as GenericInstanceType;
			if (generictype == null)
				return module.ImportReference(type);
 
			var imported = new GenericInstanceType(module.ImportReference(generictype.ElementType));
 
			foreach (var argument in generictype.GenericArguments)
				imported.GenericArguments.Add(ImportUnresolvedType(argument, module));
 
			return imported;
		}
 
		public static void ImportTypes(this MethodReference self, ModuleDefinition module)
		{
			if (!self.HasParameters)
				return;
 
			for (var i = 0; i < self.Parameters.Count; i++)
				self.Parameters[i].ParameterType = module.ImportReference(self.Parameters[i].ParameterType);
		}
 
		public static MethodReference MakeGeneric(this MethodReference self, TypeReference declaringType, params TypeReference[] arguments)
		{
			var reference = new MethodReference(self.Name, self.ReturnType)
			{
				DeclaringType = declaringType,
				HasThis = self.HasThis,
				ExplicitThis = self.ExplicitThis,
				CallingConvention = self.CallingConvention,
			};
 
			foreach (var parameter in self.Parameters)
				reference.Parameters.Add(new ParameterDefinition(parameter.ParameterType));
 
			foreach (var generic_parameter in self.GenericParameters)
				reference.GenericParameters.Add(new GenericParameter(generic_parameter.Name, reference));
 
			return reference;
		}
	}
}