各位大神,我是想做这么一个功能,比方说我自己自定义一个特性,里面就一个备注,类似于这样:
[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,但又不想写获取固定的比方说属性那种,怎么搞一个通用的啊??还是说不能,已经百度,没有相应的结果。。。。求大神!!!
你要通用的什么?依次获取一个对象上及其属性,字段等这个attribute的remark值么?
谢谢您的回答,参考下上面我的回复,大神!
@猫出没: 两种做法
1.外边传进来,你这个处理方法就不要泛型了,直接接受MemberInfo或者其数组,根据MemberInfo去拿取attribute。外边直接传入比如xxx.GetType()或xxx.GetType().GetProperties()等。
2.如果是希望外边传进来对象什么都不管的话,那你对应的方法里面就要依次从type,propertinfo,fieldinfo等获取这些信息。
@Daniel Cai: 谢谢您的回答,刚才你说的第一种方式我懂了,直接固定了类型。
第二种这个依次获取不太明白,主要是不太明白怎么知道穿的是什么,怎么知道我要返回的是type|propertinfo|fieldinfo呢?
@猫出没: 你传个BindingFlags进去嘛,然后里面对传入的BindingFlags做按位与操作判断需要哪些信息。
@猫出没: ps:第一种也没有固定类型啊,你需要的这些信息都是从MemberInfo中派生出来的,不管是Type还是PropertyInfo等都可以传进去。
@Daniel Cai: 明白了,谢谢!
把参数value去掉
不行啊,比方说:
[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?
@猫出没: 乱七八糟.那你参数类型改为string,然后定义一个硬性规则.
如果参数为空.返回类上的特性值.如果不为空.则从类型中查找对应的属性.返回属性的特性值.
PS:这种东西没点卵用.属于毫无意义级别.
@吴瑞祥: 。。。可能是我太执着了(PS:往脸上贴金了),谢谢回答!