// // Author: // Jb Evain (jbevain@gmail.com) // // Copyright (c) 2008 - 2015 Jb Evain // Copyright (c) 2008 - 2011 Novell, Inc. // // Licensed under the MIT/X11 license. // using MonoFN.Collections.Generic; using System.Threading; namespace MonoFN.Cecil { public interface IGenericParameterProvider : IMetadataTokenProvider { bool HasGenericParameters { get; } bool IsDefinition { get; } ModuleDefinition Module { get; } Collection GenericParameters { get; } GenericParameterType GenericParameterType { get; } } public enum GenericParameterType { Type, Method } internal interface IGenericContext { bool IsDefinition { get; } IGenericParameterProvider Type { get; } IGenericParameterProvider Method { get; } } internal static partial class Mixin { public static bool GetHasGenericParameters(this IGenericParameterProvider self, ModuleDefinition module) { return module.HasImage() && module.Read(self, (provider, reader) => reader.HasGenericParameters(provider)); } public static Collection GetGenericParameters(this IGenericParameterProvider self, ref Collection collection, ModuleDefinition module) { if (module.HasImage()) return module.Read(ref collection, self, (provider, reader) => reader.ReadGenericParameters(provider)); Interlocked.CompareExchange(ref collection, new GenericParameterCollection(self), null); return collection; } } }