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.
81 lines
2.6 KiB
81 lines
2.6 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Reflection;
|
|
|
|
namespace Apewer.Source
|
|
{
|
|
|
|
/// <summary>索引。</summary>
|
|
[Serializable]
|
|
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
|
|
public sealed class IndexAttribute : Attribute, IToJson
|
|
{
|
|
|
|
PropertyInfo _property = null;
|
|
ColumnAttribute _column;
|
|
|
|
string _name = null;
|
|
Order _order = Order.Ascend;
|
|
|
|
/// <summary>索引名称。</summary>
|
|
public string Name { get => _name; }
|
|
|
|
/// <summary>排序。</summary>
|
|
public Order Order { get => _order; set => _order = value; }
|
|
|
|
/// <summary>列。</summary>
|
|
public ColumnAttribute Column { get => _column; }
|
|
|
|
/// <summary>属性。</summary>
|
|
public PropertyInfo Property { get => _property; }
|
|
|
|
/// <summary>表示此属性是索引的一部分。</summary>
|
|
/// <param name="name">索引名称。</param>
|
|
public IndexAttribute(string name)
|
|
{
|
|
if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
|
|
_name = name;
|
|
}
|
|
|
|
internal void SetColumn(ColumnAttribute column)
|
|
{
|
|
_column = column;
|
|
}
|
|
|
|
/// <summary>解析列的索引。</summary>
|
|
/// <remarks>注意:此方法不再抛出异常,当不存在正确的列特性时将返回 NULL 值</remarks>
|
|
public static IndexAttribute[] Parse(PropertyInfo property)
|
|
{
|
|
if (property == null) return null;
|
|
|
|
var attributes = property.GetCustomAttributes(typeof(IndexAttribute), true);
|
|
var ias = new List<IndexAttribute>();
|
|
foreach (var attribute in attributes)
|
|
{
|
|
var ia = attribute as IndexAttribute;
|
|
if (ia == null) continue;
|
|
if (ia._name.IsEmpty()) continue;
|
|
|
|
ia._property = property;
|
|
ias.Add(ia);
|
|
}
|
|
return ias.ToArray();
|
|
}
|
|
|
|
/// <summary>生成 Json 对象。</summary>
|
|
/// <exception cref="NotImplementedException"></exception>
|
|
public Json ToJson()
|
|
{
|
|
var json = Json.NewObject();
|
|
json.SetProperty("name", _name);
|
|
json.SetProperty("order", _order.ToString());
|
|
if (_column != null) json.SetProperty("column", _column.ToJson());
|
|
return json;
|
|
}
|
|
|
|
/// <summary></summary>
|
|
public override string ToString() => $"Index = {_name}, Field = {_column?.Field}, Order = {_order}";
|
|
|
|
}
|
|
|
|
}
|
|
|