上面的自定义特性都是通过构造函数设置字段私有字段,然后通过只提供了get的属性来访问。那么可否直接在特性里面定义拥有get和set的属性吗?答案是肯定的。那怎么在使用特性的时候设置这个属性呢?我们接着往下看。
我们接着在自定义特性里面添加一个属性。
修改时间 modifyTime { get; set; }
使用自定义特性。
[TMessg(, , , modifyTime = )] public class TClass { //................ }
我们发现,直接在输入了构造函数之后接着设置属性就可以。(这就相当于可选参数了,属性当然可以随便你是否设置了。不过这里需要注意了,前面的参数一定要按照定义的特性构造函数的参数顺序)
这种参数,我们成为命名参数。
我们来继续要看看AttributeUsage(这个描述特性的特性--“元元数据”)我们F12看看AttributeUsage的定义
看上去,同样也只是普通的特性。实际上也只是个普通的特性。>_<
我们来看看他的这几个属性是干嘛的。从最后一个开始看。
1.AttributeTargets,我们在上面其实就已经看到并也已经使用了。
我们设置的是可用于所有对象。AttributeTargets其实是个枚举,每个值对于一个类型对象。
你可以直接在 AttributeTargets F12进去:
我们看到了每个值代表可以用于所对于的对象类型。2.Inherited(是一个布尔值):“如果该属性可由派生类和重写成员继承,则为 true,否则为 false。 默认值为 true”
如下,我们设置 Inherited = false 那么继承TClass的T2Class无法访问到TClass中设置的特性元数据。
namespace net { [AttributeUsage(AttributeTargets.All, Inherited = TMessgAttribute : Attribute//1.定义类TMessg加上后缀TMessgAttribute 2.继承Attribute。 { public TMessgAttribute() { } TMessgAttribute(string createTime, string createName, string mess) { this._createName = createName; this._createTime = createTime; this._mess = mess; } private string _createTime; public string createTime { get { return _createTime; }//4.只能有get方法 } private string _createName; public string createName { get { return _createName; } } private string _mess; public string mess { get { return _mess; } } 修改时间 modifyTime { get; set; } } class Program { static void Main(string[] args) { System.Reflection.MemberInfo info = typeof(T2Class); //通过反射得到TClass类的信息 TMessgAttribute hobbyAttr = (TMessgAttribute)Attribute.GetCustomAttribute(info, typeof(TMessgAttribute)); Console.WriteLine(, info.Name); if (hobbyAttr != null) { Console.WriteLine(, hobbyAttr.createTime); Console.WriteLine(, hobbyAttr.createName); Console.WriteLine(, hobbyAttr.mess); Console.WriteLine(, hobbyAttr.modifyTime); } Console.ReadKey(); } } [TMessg(, , , modifyTime = )] public class TClass { //................ } public class T2Class : TClass { //........... } }
View Code反之,我们设置 Inherited = true (或者不设置任何,因为默认就是true)打印如下:
3.AllowMultiple(也是一个布尔值):“如果允许指定多个实例,则为 true;否则为 false。 默认值为 false。”
我们设置两个特性试试,如:
如果我们想要这样设置怎么办。在AttributeUsage中设置 AllowMultiple = true 如:
那么上面报错的地方将会打印:
注意:上面的打印地方的代码需要修改。因为之前是打印一个特性信息,这里是打印一个特性数组集合的信息。