HTML5技术

【备战面试之】一、特性是什么东东 - 敷衍不起(2)

字号+ 作者:H5之家 来源:H5之家 2015-12-21 09:39 我要评论( )

上面的自定义特性都是通过构造函数设置字段私有字段,然后通过只提供了get的属性来访问。那么可否直接在特性里面定义拥有get和set的属性吗?答案是肯定的。那怎么在使用特性的时候设置这个属性呢?我们接着往下看。

上面的自定义特性都是通过构造函数设置字段私有字段,然后通过只提供了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 如:

那么上面报错的地方将会打印:

注意:上面的打印地方的代码需要修改。因为之前是打印一个特性信息,这里是打印一个特性数组集合的信息。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • HTML5新特性-多线程(Worker SharedWorker) - 大~熊

    HTML5新特性-多线程(Worker SharedWorker) - 大~熊

    2017-04-18 11:01

  • [干货来袭]C#7.0新特性(VS2017可用) - GuZhenYin

    [干货来袭]C#7.0新特性(VS2017可用) - GuZhenYin

    2017-03-10 14:01

  • EntityFramework Core 1.1有哪些新特性呢?我们需要知道 - JeffckyWang

    EntityFramework Core 1.1有哪些新特性呢?我们需要知道 - JeffckyWa

    2017-01-22 18:01

  • 2017年要学习的三个CSS新特性 - 绿岛之北

    2017年要学习的三个CSS新特性 - 绿岛之北

    2017-01-20 14:01

网友点评
"