108 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C#
		
	
	
#if !NO_RUNTIME
 | 
						|
using System;
 | 
						|
using System.Reflection;
 | 
						|
 | 
						|
namespace ProtoBuf.Meta
 | 
						|
{
 | 
						|
    internal abstract class AttributeMap
 | 
						|
    {
 | 
						|
#if DEBUG
 | 
						|
        [Obsolete("Please use AttributeType instead")]
 | 
						|
        new public Type GetType() => AttributeType;
 | 
						|
#endif
 | 
						|
        public override string ToString() => AttributeType?.FullName ?? "";
 | 
						|
        public abstract bool TryGet(string key, bool publicOnly, out object value);
 | 
						|
        public bool TryGet(string key, out object value)
 | 
						|
        {
 | 
						|
            return TryGet(key, true, out value);
 | 
						|
        }
 | 
						|
        public abstract Type AttributeType { get; }
 | 
						|
        public static AttributeMap[] Create(TypeModel model, Type type, bool inherit)
 | 
						|
        {
 | 
						|
 | 
						|
#if COREFX || PROFILE259
 | 
						|
			Attribute[] all = System.Linq.Enumerable.ToArray(System.Linq.Enumerable.OfType<Attribute>(type.GetTypeInfo().GetCustomAttributes(inherit)));
 | 
						|
#else
 | 
						|
            object[] all = type.GetCustomAttributes(inherit);
 | 
						|
#endif
 | 
						|
            AttributeMap[] result = new AttributeMap[all.Length];
 | 
						|
            for(int i = 0 ; i < all.Length ; i++)
 | 
						|
            {
 | 
						|
                result[i] = new ReflectionAttributeMap((Attribute)all[i]);
 | 
						|
            }
 | 
						|
            return result;
 | 
						|
        }
 | 
						|
 | 
						|
        public static AttributeMap[] Create(TypeModel model, MemberInfo member, bool inherit)
 | 
						|
        {
 | 
						|
 | 
						|
#if COREFX || PROFILE259
 | 
						|
			Attribute[] all = System.Linq.Enumerable.ToArray(System.Linq.Enumerable.OfType<Attribute>(member.GetCustomAttributes(inherit)));
 | 
						|
#else
 | 
						|
            object[] all = member.GetCustomAttributes(inherit);
 | 
						|
#endif
 | 
						|
            AttributeMap[] result = new AttributeMap[all.Length];
 | 
						|
            for(int i = 0 ; i < all.Length ; i++)
 | 
						|
            {
 | 
						|
                result[i] = new ReflectionAttributeMap((Attribute)all[i]);
 | 
						|
            }
 | 
						|
            return result;
 | 
						|
        }
 | 
						|
        public static AttributeMap[] Create(TypeModel model, Assembly assembly)
 | 
						|
        {
 | 
						|
#if COREFX || PROFILE259
 | 
						|
			Attribute[] all = System.Linq.Enumerable.ToArray(assembly.GetCustomAttributes());
 | 
						|
#else
 | 
						|
            const bool inherit = false;
 | 
						|
            object[] all = assembly.GetCustomAttributes(inherit);
 | 
						|
#endif
 | 
						|
            AttributeMap[] result = new AttributeMap[all.Length];
 | 
						|
            for(int i = 0 ; i < all.Length ; i++)
 | 
						|
            {
 | 
						|
                result[i] = new ReflectionAttributeMap((Attribute)all[i]);
 | 
						|
            }
 | 
						|
            return result;
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        public abstract object Target { get; }
 | 
						|
 | 
						|
        private sealed class ReflectionAttributeMap : AttributeMap
 | 
						|
        {
 | 
						|
            private readonly Attribute attribute;
 | 
						|
 | 
						|
            public ReflectionAttributeMap(Attribute attribute)
 | 
						|
            {
 | 
						|
                this.attribute = attribute;
 | 
						|
            }
 | 
						|
 | 
						|
            public override object Target => attribute;
 | 
						|
 | 
						|
            public override Type AttributeType => attribute.GetType();
 | 
						|
 | 
						|
            public override bool TryGet(string key, bool publicOnly, out object value)
 | 
						|
            {
 | 
						|
                MemberInfo[] members = Helpers.GetInstanceFieldsAndProperties(attribute.GetType(), publicOnly);
 | 
						|
                foreach (MemberInfo member in members)
 | 
						|
                {
 | 
						|
                    if (string.Equals(member.Name, key, StringComparison.OrdinalIgnoreCase))
 | 
						|
                    {
 | 
						|
                        if (member is PropertyInfo prop) {
 | 
						|
                            value = prop.GetValue(attribute, null);
 | 
						|
                            return true;
 | 
						|
                        }
 | 
						|
                        if (member is FieldInfo field) {
 | 
						|
                            value = field.GetValue(attribute);
 | 
						|
                            return true;
 | 
						|
                        }
 | 
						|
 | 
						|
                        throw new NotSupportedException(member.GetType().Name);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                value = null;
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
#endif |