发布 AutoRssReceiver Console 机器人! 兼讲: .Net 中的 Attribute (特性)

本文介绍发布的AutoRssReceiver Console机器人用于定时自动收取rss,与之前利用反射编写通用rss 2.0 reader的博客最大不同是利用Attribute保存类成员变量与XML Node的映射关系。还阐述了自定义Attribute要结合Reflection实现功能,给出相关示例及代码下载链接。

发布 AutoRssReceiver Console 机器人用于定时自动收取 rss !
本文同我的这篇 Blog
.Net/C#: 利用反射编写通用的 rss 2.0 的 reader
http://www.cnblogs.com/microshaoft/archive/2005/03/27/126669.html

最大不同就是:
利用 Attribute (特性) 保存 "类的成员变量" 与 "XML Node" 的映射关系!(Design Time)

如果要《理解.NET中的Attribute(特性) 》请看:
http://blog.joycode.com/joe/archive/2004/11/15/38952.aspx
个人认为评论对实现自定义 Attribute 更有帮助!
当初我发表的评论:

我理解为是对 assembly 元数据的拓展!
可修饰 assembly class method parameter property !
自定义 Attribute 要结合 Reflection 才能真正实现自己的功能!
其中
Obsolete("Will be removed in next version", Reviewed = true)
"Will be removed in next version" 是符合构造函数签名的参数!
Reviewed = true : Reviewed 是成员变量!
Obsolete("Will be removed in next version", Reviewed = true) 就是 Obsolete (Attribute)类的实例

(当然后面的评论同样精彩)

意思就是说:
传统的那些: 修饰符 public private internal static ... 现在不够用了,
想附加一些自定义的信息来分别修饰 assembly class method parameter property!
但是要想编程读取这些附加信息,要结合 Reflection 才能实现自己的功能!
如果: 给类的属性 添加了一个 Attribute 来修饰这个属性!
我们可以理解为 "属性的(附加自定义的)属性" 就是 Attribute!("属性的属性"就是 Attribute(特性))
这里的"附加自定义"是指相对于传统的那些修饰符!
从语法格式上看: 当作"标签"理解,确实也很直观形象!

下面是例子:
1.实现一个用于 修饰 "类的成员变量" 的 自定义 Attribute!

None.gif     [AttributeUsage(AttributeTargets.Field)]
None.gif    
public   class  XmlNodeNameAttribute : Attribute
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
private string _Name;
InBlock.gif
InBlock.gif        
public XmlNodeNameAttribute(string Name)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
this._Name = Name;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public string Name
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return this._Name;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

2.定义一个类,用 XmlNodeNameAttribute 来修饰 成员变量

None.gif      public   class  RssHeader
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
//运行时该类的"对象实例"的私有 Field 的值将 class SimpleRssReader 中通过反射赋值
InBlock.gif        
//大家看下面标签: XmlNodeNameAttribute("dc:language")
InBlock.gif        
//就是一个 XmlNodeNameAttribute 类的实例
InBlock.gif
        [XmlNodeNameAttribute("dc:language")] 
InBlock.gif        
private string _dclanguage; //dc:language
ExpandedBlockEnd.gif
    }

3.编程访问读取 该类 的这些 Attribute

None.gif     Type t  =   typeof  (RssHeader);
None.gif    
// Type t = typeof (RssItem);
None.gif
    Hashtable ht  =   new  Hashtable();
None.gif    FieldInfo[] fis 
=  t.GetFields(BindingFlags.NonPublic  |  BindingFlags.Instance  |  BindingFlags.Public);
None.gif    
foreach  (FieldInfo fi  in  fis)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
object[] attributes = fi.GetCustomAttributes(false);
InBlock.gif        
if (attributes.Length > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
foreach (XmlNodeNameAttribute a in attributes)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
if (a != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    ht.Add(a.Name, fi.Name);
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }


完整代码在这里下载:
http://files.cnblogs.com/Microshaoft/AutoRssReceiver.rar

转载于:https://www.cnblogs.com/Microshaoft/archive/2005/04/09/134722.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值