/// <summary>获取自定义属性的值。可用于ReflectionOnly加载的程序集</summary> /// <typeparam name="TAttribute"></typeparam> /// <typeparam name="TResult"></typeparam> /// <param name="target">目标对象</param> /// <param name="inherit">是否递归</param> /// <returns></returns> public static TResult GetCustomAttributeValue <TAttribute, TResult>(this MemberInfo target, Boolean inherit = true) where TAttribute : Attribute { if (target == null) { return(default(TResult)); } try { var list = CustomAttributeData.GetCustomAttributes(target); if (list != null && list.Count > 0) { foreach (var item in list) { if (!TypeX.Equal(typeof(TAttribute), item.Constructor.DeclaringType)) { continue; } var args = item.ConstructorArguments; if (args != null && args.Count > 0) { return((TResult)args[0].Value); } } } if (inherit && target is Type) { target = (target as Type).BaseType; if (target != null && target != typeof(Object)) { return(GetCustomAttributeValue <TAttribute, TResult>(target, inherit)); } } } catch { // 出错以后,如果不是仅反射加载,可以考虑正面来一次 if (!target.Module.Assembly.ReflectionOnly) { //var att = GetCustomAttribute<TAttribute>(target, inherit); var att = target.GetCustomAttribute <TAttribute>(inherit); if (att != null) { var pi = typeof(TAttribute).GetProperties().FirstOrDefault(p => p.PropertyType == typeof(TResult)); if (pi != null) { return((TResult)att.GetValue(pi)); } } } } return(default(TResult)); }
/// <summary>获取自定义属性的值。可用于ReflectionOnly加载的程序集</summary> /// <typeparam name="TAttribute"></typeparam> /// <typeparam name="TResult"></typeparam> /// <param name="target"></param> /// <param name="inherit">是否递归</param> /// <returns></returns> public static TResult GetCustomAttributeValue <TAttribute, TResult>(this Type target, Boolean inherit) { if (target == null) { return(default(TResult)); } var list = CustomAttributeData.GetCustomAttributes(target); if (list != null && list.Count > 0) { foreach (var item in list) { if (!TypeX.Equal(typeof(TAttribute), item.Constructor.DeclaringType)) { continue; } var args = item.ConstructorArguments; if (args != null && args.Count > 0) { return((TResult)args[0].Value); } } } if (inherit) { target = target.BaseType; if (target != null && target != typeof(Object)) { return(GetCustomAttributeValue <TAttribute, TResult>(target, inherit)); } } return(default(TResult)); }