Attribute特性,可以往程序集中写入一些元数据。微软类库中自带很多 Attribute类,某些时候,需要对类标注一下 Attribute。那么自定义 Attribute的用处是什么的,或者说,什么时候我们需要自定义 Attribute。
在我看来, 自定义Attribute没啥用。常规的项目开发中,我都可以用变通的方式去实现。当然硬是要为了用而用也可以,就是写一些信息到程序集中,然后在调用的时候在读取这些信息。采用反射的技术,但这不是多此一举影响性能么,直接把信息传给类不更好吗?
所以不清楚何时何地必须要Attribute。下面的例子,就是,用到反射读取Attribute的信息。
using
System
;
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
using System.Dynamic ;
namespace ConsoleApplication1
{
class Program
{
// create custom attribute to be assigned to class members
[AttributeUsage (AttributeTargets . Class |
AttributeTargets . Constructor |
AttributeTargets . Field |
AttributeTargets . Method |
AttributeTargets . Property,
AllowMultiple = true ) ]
public class BugFixAttribute : System . Attribute
{
// attribute constructor for positional parameters
public BugFixAttribute
(
int bugID,
string programmer,
string date
)
{
this . BugID = bugID ;
this . Programmer = programmer ;
this . Date = date ;
}
// accessors
public int BugID { get ; private set ; }
public string Date { get ; private set ; }
public string Programmer { get ; private set ; }
// property for named parameter
public string Comment { get ; set ; }
}
// ********* assign the attributes to the class ********
[BugFixAttribute ( 121, "Jesse Liberty", "01/03/08" ) ]
[BugFixAttribute ( 107, "Jesse Liberty", "01/04/08",
Comment = "Fixed off by one errors" ) ]
public class MyMath
{
public double DoFunc1 ( double param1 )
{
return param1 + DoFunc2 (param1 ) ;
}
public double DoFunc2 ( double param1 )
{
return param1 / 3 ;
}
}
public class Tester
{
static void Main ( string [ ] args )
{
MyMath mm = new MyMath ( ) ;
Console . WriteLine ( "Calling DoFunc(7). Result: {0}",
mm . DoFunc1 ( 7 ) ) ;
// get the member information and use it to
// retrieve the custom attributes
System.Reflection . MemberInfo inf = typeof (MyMath ) ;
object [ ] attributes ;
attributes = inf . GetCustomAttributes (
typeof (BugFixAttribute ), false ) ;
// iterate through the attributes, retrieving the
// properties
foreach ( Object attribute in attributes )
{
BugFixAttribute bfa = (BugFixAttribute )attribute ;
Console . WriteLine ( "\nBugID: {0}", bfa . BugID ) ;
Console . WriteLine ( "Programmer: {0}", bfa . Programmer ) ;
Console . WriteLine ( "Date: {0}", bfa . Date ) ;
Console . WriteLine ( "Comment: {0}", bfa . Comment ) ;
}
}
}
}
}
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
using System.Dynamic ;
namespace ConsoleApplication1
{
class Program
{
// create custom attribute to be assigned to class members
[AttributeUsage (AttributeTargets . Class |
AttributeTargets . Constructor |
AttributeTargets . Field |
AttributeTargets . Method |
AttributeTargets . Property,
AllowMultiple = true ) ]
public class BugFixAttribute : System . Attribute
{
// attribute constructor for positional parameters
public BugFixAttribute
(
int bugID,
string programmer,
string date
)
{
this . BugID = bugID ;
this . Programmer = programmer ;
this . Date = date ;
}
// accessors
public int BugID { get ; private set ; }
public string Date { get ; private set ; }
public string Programmer { get ; private set ; }
// property for named parameter
public string Comment { get ; set ; }
}
// ********* assign the attributes to the class ********
[BugFixAttribute ( 121, "Jesse Liberty", "01/03/08" ) ]
[BugFixAttribute ( 107, "Jesse Liberty", "01/04/08",
Comment = "Fixed off by one errors" ) ]
public class MyMath
{
public double DoFunc1 ( double param1 )
{
return param1 + DoFunc2 (param1 ) ;
}
public double DoFunc2 ( double param1 )
{
return param1 / 3 ;
}
}
public class Tester
{
static void Main ( string [ ] args )
{
MyMath mm = new MyMath ( ) ;
Console . WriteLine ( "Calling DoFunc(7). Result: {0}",
mm . DoFunc1 ( 7 ) ) ;
// get the member information and use it to
// retrieve the custom attributes
System.Reflection . MemberInfo inf = typeof (MyMath ) ;
object [ ] attributes ;
attributes = inf . GetCustomAttributes (
typeof (BugFixAttribute ), false ) ;
// iterate through the attributes, retrieving the
// properties
foreach ( Object attribute in attributes )
{
BugFixAttribute bfa = (BugFixAttribute )attribute ;
Console . WriteLine ( "\nBugID: {0}", bfa . BugID ) ;
Console . WriteLine ( "Programmer: {0}", bfa . Programmer ) ;
Console . WriteLine ( "Date: {0}", bfa . Date ) ;
Console . WriteLine ( "Comment: {0}", bfa . Comment ) ;
}
}
}
}
}
本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/895973,如需转载请自行联系原作者