using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace Song.ViewData.Attri
{
public class WeishaAttr : Attribute
{
//所有特性
public static Type[] Attrs = null;
///
/// 忽略此方法,默认为false
/// 说明:则某个类设置了特性后,下面的所有方法都需要验证,除非设置[Admin(Ignore=true)]
///
public bool Ignore { get; set; }
public WeishaAttr(bool ignore)
{
Ignore = ignore;
}
public WeishaAttr()
{
}
///
/// 获取方法的某一类特性
///
/// 要验证的方法
///
public static T GetAttr(MemberInfo method) where T : WeishaAttr
{
T attr = null;
//先验证对象,如果对象需验证,则下面方法全部需要验证登录,除非方法设置了[Admin(Ignore = true)]
object[] attrsObj = method.DeclaringType.GetCustomAttributes(typeof(T), true);
if (attrsObj.Length > 0) attr = attrsObj[0] as T;
//再验证方法
object[] attrsMethod = method.GetCustomAttributes(typeof(T), true);
if (attrsMethod.Length > 0)
{
T admin = attrsMethod[0] as T;
if (attr == null) attr = admin;
if (attr != null && admin.Ignore) attr.Ignore = admin.Ignore;
}
return attr;
}
///
/// 获取方法的特性
///
/// 要验证的方法
///
public static List GetAttrs(MemberInfo method) where T : WeishaAttr
{
List list = new List();
//先验证对象,如果对象需验证,则下面方法全部需要验证登录,除非方法设置了[Admin(Ignore = true)]
object[] attrsObj = method.DeclaringType.GetCustomAttributes(typeof(T), true);
foreach (object o in attrsObj) list.Add(o as T);
//再验证方法
object[] attrsMethod = method.GetCustomAttributes(typeof(T), true);
foreach (object b in attrsMethod)
{
bool isExist = false;
foreach (T t in list)
{
if (t.GetType().FullName == b.GetType().FullName)
{
isExist = true;
T tm = b as T;
if (tm.Ignore) t.Ignore = tm.Ignore;
break;
}
}
if (!isExist) list.Add(b as T);
}
return list;
}
///
/// 初始化,获取所有特性
///
public static Type[] Initialization()
{
if (Attrs != null) return Attrs;
string assemblyName = "Song.ViewData";
Assembly assembly = Assembly.Load(assemblyName);
Attrs = assembly.GetExportedTypes()
.Where(t => t.FullName.StartsWith("Song.ViewData.Attri") && !t.IsAbstract)
.OrderBy(c => c.Name).ToArray();
return Attrs;
}
}
}