C# Attribute学习

  由于项目中需要使用到序列化相关的技术,从而想到是否可以使用C#中的特性,特此花了近两小时学习了一下。

  对于特性的学习,主要参考了两篇博文,特此感谢。以下附链接:

  http://www.cnblogs.com/luckdv/articles/1682488.html

  http://www.cnblogs.com/liuxinxin/articles/2265672.html

  在学习的过程中,一直以为特性对于元素可以起到什么实质性的影响,例如系统内置的特性,Obsolete可以阻止用户使用所引用该特性的元素。

  由于以上两篇文章对于特性的描述比较详细,在此就不写太多废话,直接上实例(模仿Json解析,并使用Attribute将一个属性的值引用到另一个属性),也行效果会更好。例子比较简单,主要起引导作用。

  

using System;

using System.Reflection;

namespace Attribute

{

class Program

{

static void Main( string[] args)

{

string s = "{A:1,B:2}";

AtoC ab = Deserializer< AtoC>(s);

Console.WriteLine( "A=" + ab.A);

Console.WriteLine( "B=" + ab.B);

Console.WriteLine( "C=" + ab.C);

}

private static T Deserializer<T>( string s) where T: new ()

{

Type t = typeof(T);

T ins = new T();

//解析所有的属性

string[] sour = s.TrimStart(‘{‘).TrimEnd(‘}‘ ).Split(‘,‘ );

foreach ( string sou in sour)

{

string key = sou.Split( ‘:‘)[0];

string value = sou.Split( ‘:‘)[1];

//获取属性值

PropertyInfo props = t.GetProperty(key);

props.SetValue(ins, value, null);

//获取所有的特性

object[] att = props.GetCustomAttributes(typeof(HelpAttribute ), false );

//将获到的特性所指向的对象赋值

foreach ( HelpAttribute a in att)

{

t.GetProperty(a.Param).SetValue(ins, value, null);

}

}

return ins;

}

}

[AttributeUsage( AttributeTargets.Property, AllowMultiple = false, Inherited = true )]

class HelpAttribute : Attribute

{

public HelpAttribute( string param)

{

this.param = param;

}

//只读属性

private string param;

public string Param { get { return param; } }

}

public class AtoC

{

[ Help( "C")]

public string A { get; set; }

public string B { get; set; }

public string C { get; set; }

}

}

总结:Attribute本身不具有实际作用,主要是用来描述元素。但在实际使用中可以通过反射来获取元素描述,通过对描述的分析,来进行相关的处理

时间: 2024-10-05 20:58:06

C# Attribute学习的相关文章

.net学习之Attribute特性和EF关键知识点

一.Attribute特性/标签1.Attribute用来对类.属性.方法等标注额外的信息,贴一个标签简单的说,定制特性Attribute,本质上就是一个类,它为目标元素提供关联附加信息,并在运行时以反射的方式来获取附加信息.[Obsolete("此方法已过时")]public void SayHi(){ }加上Obsolete特性,当鼠标放到调用方法上的时候,就会提示此方法已过时2.Attribute自定义特性类Attribute就是类,Attribute类名一般都以Attribut

学习笔记--【转】Parameter与Attribute的区别&amp;servletContext与ServletConfig区别

原文链接http://blog.csdn.net/saygoodbyetoyou/article/details/9006001 Parameter与Attribute的区别 request.getParameter取得Web客户端到web服务端的http请求数据(get/post),只能是string类型的,而且HttpServletRequest没有对应的setParameter()方法. 如利用href(url)和form请求服务器时,表单数据通过parameter传递到服务器,且只能为字

转:C#制作ORM映射学习笔记一 自定义Attribute类

之前在做unity项目时发现只能用odbc连接数据库,感觉非常的麻烦,因为之前做web开发的时候用惯了ORM映射,所以我想在unity中也用一下ORM(虽然我知道出于性能的考虑这样做事不好的,不过自己的小项目吗管他的,自己爽就行了).不过现在世面上的ORM映射基本都是为web项目设计的,与unity项目很难契合,所以我决定自己做一个简易的ORM映射.虽然想的很美但是实际做起来才发现还是挺复杂的,所以我在这里记录一下这次的开发过程,防止以后遗忘. 今天先记录一下如何通过自定义attribute类实

C#学习笔记(十六):Attribute

Attribute可以为类或方法添加一些附加的信息,我们可以看看MSDN对Attribute的描述: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为. 在.NET中,Attribute被用来处理多种问题,比如序列化.程序的安全特征.防止即时编译器对程序代码

WebApi2官网学习记录---Attribute Routing

从WebApi 1迁移到WebAPI 2要改变配置代码如下: WebApi 1: protected void Application_Start() { // WARNING - Not compatible with attribute routing. WebApiConfig.Register(GlobalConfiguration.Configuration); } WebAPI 2: protected void Application_Start() { // Pass a del

XPath学习12:attribute

attribute  选取当前节点的所有属性 attribute轴选取当前节点的所有属性,获取的结果是属性而不是节点,全面所有的轴都是选取节点. /AAA/BBB/attribute::*     选取/AAA/BBB节点的所有属性 <AAA>      <BBB aaa = "111" bbb = "222">           <CCC/>           <CCC xxx = "555" yy

Salesforce学习之路(十一)Aura组件属性&lt;aura:attribute /&gt;

1. <aura:attribute />语法 Aura组件属性类似与Apex中类的成员变量(或者说Java中类的成员变量).他们是组件在特定的实例上设置的类型化字段,可以使用表达式语法从组件的标记内引用他们. 语法:<aura:attribute name="**" type="**" default="**" required="true/false" access="**" desc

javaweb学习总结(二十六)——jsp简单标签标签库开发(二)

一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段,这段JSP片段中不能包含JSP脚本元素. WEB容器在处理简单标签的标签体时,会把标签体内容用一个JspFragment对象表示,并调用标签处理器对象的setJspBody方法把JspFragment对象传递给标签处理器对象.JspFragment类中只定义了两个方法,如下所示: getJspCon

微软CodeDom模型学习笔记(全)

要点1 CodeDomProvider MSDN描述 CodeDomProvider可用于创建和检索代码生成器和代码编译器的实例.代码生成器可用于以特定的语言生成代码,而代码编译器可用于将代码编译为程序集. 注意:在 .NET Framework 2.0版中,在代码生成器和代码编译器中可用的方法可直接从代码提供程序获得.您不需要调用CreateGenerator 或CreateCompiler 来访问这些方法,这些方法被标记为已过时.这适用于预先存在的以及新的代码提供程序实现. CodeDomP