using Apewer.Internals; using System; using System.Collections.Generic; using System.Reflection; using System.Text; namespace Apewer { /// <summary>标题特性。</summary> [Serializable] [AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)] public class CaptionAttribute : Attribute { private string _title, _description, _remark; /// <summary></summary> public CaptionAttribute(string title = null, string description = null, string remark = null) { Title = title; Description = description; Remark = remark; } /// <summary></summary> public string Title { get { return _title; } set { _title = value ?? Constant.EmptyString; } } /// <summary></summary> public string Description { get { return _description; } set { _description = value ?? Constant.EmptyString; } } /// <summary></summary> public string Remark { get { return _remark; } set { _remark = value ?? Constant.EmptyString; } } /// <summary>从 <see cref="CaptionAttribute"/> 到 Boolean 的隐式转换,判断 <see cref="CaptionAttribute"/> 有效。</summary> public static implicit operator bool(CaptionAttribute instance) => instance != null; #region static static Dictionary<string, CaptionAttribute> _cache = new Dictionary<string, CaptionAttribute>(); /// <summary>解析标题特性,默认使用缓存以提升性能。</summary> /// <remarks>若修改已缓存实例的属性值,则下次从缓存中获取实例时将带有新的属性值。</remarks> /// <returns>已存在的 <see cref="CaptionAttribute"/> 实例。</returns> public static CaptionAttribute Parse(Type type, bool useCache = true) { if (type == null) return null; var cacheKey = type.FullName; if (useCache) { var hint = null as CaptionAttribute; lock (_cache) { if (_cache.ContainsKey(cacheKey)) { hint = _cache[cacheKey]; } } if (hint != null) return hint; } var attributes = type.GetCustomAttributes(typeof(CaptionAttribute), false); if (attributes.LongLength < 1L) return null; var attribute = (CaptionAttribute)attributes[0]; if (useCache) { lock (_cache) { if (!_cache.ContainsKey(cacheKey)) _cache.Add(cacheKey, attribute); } } return attribute; } /// <summary>解析标题特性,默认使用缓存以提升性能。</summary> /// <remarks>若修改已缓存实例的属性值,则下次从缓存中获取实例时将带有新的属性值。</remarks> /// <returns>已存在的 <see cref="CaptionAttribute"/> 实例。</returns> public static CaptionAttribute Parse<T>(bool useCache = true) => Parse(typeof(T), useCache); #endregion } }