首页 新闻 搜索 专区 学院

C# 泛型Attribute的问题!

0
悬赏园豆:20 [已解决问题] 解决于 2017-11-06 14:12

各位大神,我是想做这么一个功能,比方说我自己自定义一个特性,里面就一个备注,类似于这样:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Interface, AllowMultiple = false, Inherited = true)]
    public class RemarkAttribute : Attribute
    {
        public RemarkAttribute(string remark)
        {
            this.remark = remark;
        }

        public string remark { get; set; }
    }

我就想这个他能够在类、枚举、字段、属性等都能标记,但是在标记之后,我去调用的时候发现没有办法同时用在这几个上面,比如:

public static class AttributeDo
    {
        public static string RemarkDo<T>(T value)
        {
            Type type = typeof(T);
            if (type.IsDefined(typeof(RemarkAttribute), true))
            {
                RemarkAttribute remarkAttribute = (RemarkAttribute)type.GetCustomAttributes(typeof(RemarkAttribute), true)[0];
                return remarkAttribute.remark;
            }
            else
                return type.Name;
            
        }
    }

我写的一个泛型调用,发现获取的type是运行时type,但又不想写获取固定的比方说属性那种,怎么搞一个通用的啊??还是说不能,已经百度,没有相应的结果。。。。求大神!!!

猫出没的主页 猫出没 | 初学一级 | 园豆:120
提问于:2017-11-05 23:53
< >
分享
最佳答案
0

你要通用的什么?依次获取一个对象上及其属性,字段等这个attribute的remark值么?

收获园豆:12
Daniel Cai | 专家六级 |园豆:10374 | 2017-11-06 09:59

谢谢您的回答,参考下上面我的回复,大神!

猫出没 | 园豆:120 (初学一级) | 2017-11-06 10:54

@猫出没: 两种做法

1.外边传进来,你这个处理方法就不要泛型了,直接接受MemberInfo或者其数组,根据MemberInfo去拿取attribute。外边直接传入比如xxx.GetType()或xxx.GetType().GetProperties()等。

2.如果是希望外边传进来对象什么都不管的话,那你对应的方法里面就要依次从type,propertinfo,fieldinfo等获取这些信息。

Daniel Cai | 园豆:10374 (专家六级) | 2017-11-06 11:05

@Daniel Cai: 谢谢您的回答,刚才你说的第一种方式我懂了,直接固定了类型。

第二种这个依次获取不太明白,主要是不太明白怎么知道穿的是什么,怎么知道我要返回的是type|propertinfo|fieldinfo呢?

猫出没 | 园豆:120 (初学一级) | 2017-11-06 11:17

@猫出没: 你传个BindingFlags进去嘛,然后里面对传入的BindingFlags做按位与操作判断需要哪些信息。

Daniel Cai | 园豆:10374 (专家六级) | 2017-11-06 11:36

@猫出没: ps:第一种也没有固定类型啊,你需要的这些信息都是从MemberInfo中派生出来的,不管是Type还是PropertyInfo等都可以传进去。

Daniel Cai | 园豆:10374 (专家六级) | 2017-11-06 11:37

@Daniel Cai: 明白了,谢谢!

猫出没 | 园豆:120 (初学一级) | 2017-11-06 14:11
其他回答(1)
0

把参数value去掉

收获园豆:8
吴瑞祥 | 园豆:28841 (高人七级) | 2017-11-06 07:25

不行啊,比方说:

[Remark("用户")]
    public class User : BaseModel
    {
        [Remark("名字")]
        public string Name { get; set; }

        [Remark("帐户")]
        public string Account { get; set; }
}

有这么一个实体,那么我想写个通用的获取方法,如果按照您说的这样:

public static class AttributeDo
    {
        public static string RemarkDo<T>()
        {
            Type type = typeof(T);
            if (type.IsDefined(typeof(RemarkAttribute), true))
            {
                RemarkAttribute remarkAttribute = (RemarkAttribute)type.GetCustomAttributes(typeof(RemarkAttribute), true)[0];
                return remarkAttribute.remark;
            }
            else
                return type.Name;
            
        }
    }

那么我在调用的时候根本没法传递

我想获取类上面的,可以传入User,但是我想要获取属性上的,那么我的T传入什么类型?PropertyInfo?

支持(0) 反对(0) 猫出没 | 园豆:120 (初学一级) | 2017-11-06 10:53

@猫出没: 乱七八糟.那你参数类型改为string,然后定义一个硬性规则.

如果参数为空.返回类上的特性值.如果不为空.则从类型中查找对应的属性.返回属性的特性值.

PS:这种东西没点卵用.属于毫无意义级别.

支持(0) 反对(0) 吴瑞祥 | 园豆:28841 (高人七级) | 2017-11-06 11:39

@吴瑞祥: 。。。可能是我太执着了(PS:往脸上贴金了),谢谢回答!

支持(0) 反对(0) 猫出没 | 园豆:120 (初学一级) | 2017-11-06 14:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册