Esempio n. 1
0
        /// <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));
        }
Esempio n. 2
0
        /// <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));
        }