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

发布 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!

    [AttributeUsage(AttributeTargets.Field)]
    
public class XmlNodeNameAttribute : Attribute
    
{
        
private string _Name;

        
public XmlNodeNameAttribute(string Name)
        
{
            
this._Name = Name;
        }


        
public string Name
        
{
            
get
            
{
                
return this._Name;
            }

        }

    }

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

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

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

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

            }

        }

    }


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

原文地址:https://www.cnblogs.com/Microshaoft/p/134722.html