You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.2 KiB
99 lines
3.2 KiB
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
|
|
|
|
}
|
|
|
|
}
|