`
北极的。鱼
  • 浏览: 158953 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于C#中的特性小例子

阅读更多

最近要写一个网络报表。

众所周知,网络报表是程序员的一大噩梦。

幸运的是,了解了下需求,然后去网络上大概看了下报表相关的信息。

感觉微软自带的RDLC报表能完全满足需求了。

不过,受伤的总是我。

老大一句:“要做成组件,下次调用直接拖拉就行,不需要手动操作!”

...

请问:天黑是神马感觉?!

这句话的意思就是要完全动态生成报表(不了解rdlc报表的童鞋们去操作下试试就知道了)。

里面要用到的技术,我大概想了一下。

主要就是XML的架构定义和序列号,反序列话。其他的没什么。不过,就这2个技术,让我感觉顿时落入了地狱(两个我都不熟悉。)。

没办法,只能硬着头皮搞了。

第一个遇到的问题就是c#特性机制了。

稍微看了下,懂了,就先记录下一些自认为经典的例子吧(2个小时前,我连这个[]叫特性都不知道,或者说都没怎么见过这个运算符这个用。2个小时看了几个代码,尤其是下面示例的代码,就懂了!)。

 

不多说,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            BoardingCheckAttribute boardingCheck = null;
            object[] customAttributes = typeof(HumanPropertyBase).GetCustomAttributes(true);
            Console.WriteLine(typeof(HumanPropertyBase).IsSerializable);
            foreach (System.Attribute attribute in customAttributes)
            {
                if (attribute is BoardingCheckAttribute)
                {
                    boardingCheck = attribute as BoardingCheckAttribute;
                    Console.WriteLine(boardingCheck.Name
                        + "'s ID is "
                        + boardingCheck.ID
                        + ", he/she wants to "
                        + boardingCheck.Destination
                        + " from "
                        + boardingCheck.Departure
                        + " by the plane "
                        + boardingCheck.FlightNumber
                        + ", his/her position is "
                        + boardingCheck.PositionNumber
                        + ".");
                }
            }

            Console.ReadLine();
        }
    }
    [Serializable]
    [BoardingCheckAttribute("123","louis",22,12,"aaaa","ccccc")]
    public class HumanPropertyBase
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public int Gender { get; set; }

        [Obsolete("I'm so old, don't kill me!", true)]
        public void Run(int speed)
        {
            // Running is good for health.  
        }
    }

    public class BoardingCheckAttribute : Attribute
    {
        public string ID { get; private set; }
        public string Name { get; private set; }
        public int FlightNumber { get; private set; }
        public int PositionNumber { get; private set; }
        public string Departure { get; private set; }
        public string Destination { get; private set; }

        public BoardingCheckAttribute(string id, string name, int flightNumber, int positionNumber, string departure, string destination)
        {
            this.ID = id;
            this.Name = name;
            this.FlightNumber = flightNumber;
            this.PositionNumber = positionNumber;
            this.Departure = departure;
            this.Destination = destination;
        }

    }

}

 

 

[System.AttributeUsage(System.AttributeTargets.Class |
                       System.AttributeTargets.Struct,
                       AllowMultiple = true)  // multiuse attribute
]
public class Author : System.Attribute
{
    string name;
    public double version;

    public Author(string name)
    {
        this.name = name;
        version = 1.0;  // Default value
    }

    public string GetName()
    {
        return name;
    }
}

[Author("H. Ackerman")]
public class FirstClass
{
    // ...
}

// No Author attribute
public class SecondClass
{
    // ...
}

[Author("H. Ackerman"), Author("M. Knott", version = 2.0)]
public class ThirdClass
{
    // ...
}

class TestAuthorAttribute
{
    static void Main()
    {
        PrintAuthorInfo(typeof(FirstClass));
        PrintAuthorInfo(typeof(SecondClass));
        PrintAuthorInfo(typeof(ThirdClass));
    }

    private static void PrintAuthorInfo(System.Type t)
    {
        System.Console.WriteLine("Author information for {0}", t);
        System.Attribute[] attrs = System.Attribute.GetCustomAttributes(t); // reflection

        foreach (System.Attribute attr in attrs)
        {
            if (attr is Author)
            {
                Author a = (Author)attr;
                System.Console.WriteLine("   {0}, version {1:f}", a.GetName(), a.version);
            }
        }
    }
}

 

网上搜到的解释:(对应第二段代码)

 

使用反射访问属性(C# 编程指南)
如果没有检索自定义属性的信息和对其进行操作的方法,则定义自定义属性并将其放置在源代码中就没有意义。C# 具有一个反射系统,可用来检索用自定义属性定义的信息。主要方法是 GetCustomAttributes,它返回对象数组,这些对象在运行时等效于源代码属性。此方法具有多个重载版本。有关更多信息,请参见 Attribute。

属性规范,如:

C#
[Author("H. Ackerman", version = 1.1)]
class SampleClass

在概念上等效于:

C#
Author anonymousAuthorObject = new Author("H. Ackerman");
anonymousAuthorObject.version = 1.1;

【备:我是第一次看到这个写法,然后兴匆匆的去试了下类的属性,发现这个写法不使用了。

   疑惑:难道这个写法只适用于特性的实例化么?如果高手见到,还请指教。】

但是,直到查询 SampleClass 以获取属性时才会执行此代码。对 SampleClass 调用 GetCustomAttributes 会导致按上述方式构造并初始化一个 Author 对象。如果类还有其他属性,则其他属性对象的以类似方式构造。然后 GetCustomAttributes 返回 Author 对象和数组中的任何其他属性对象。之后就可以对此数组进行迭代,确定根据每个数组元素的类型所应用的属性,并从属性对象中提取信息。

分享到:
评论
1 楼 北极的。鱼 2011-05-26  
请记住:
属性:是面向对象思想里所说的封装在类里面的数据字段。
特性:不需要你生理上包含这些属性,就像上面的HumanBase类没有IsSerializable这样的属性,特性只需要在类或方法需要的时候加上去就行了。

就相当于:
属性是人天生的特征,而特性是以后你需要是时候才获得的特征。

相关推荐

    c#标签特性简单例子可执行

    在这个例子中,我们首先获取`MyClass`的`Type`对象,然后调用`GetCustomAttribute`方法查找`MyCustomAttribute`。如果找到了,我们就打印出描述信息。 WpfAttribute可能是项目中用于处理WPF(Windows Presentation ...

    c#中的特性(attribute)+反射的一个例子

    在这个例子中,`MyCustomAttribute`可以应用于类或方法,并且有一个`Description`属性,用于存储描述信息。 接下来,我们可以在代码中使用这个特性: ```csharp [MyCustom("这是一个使用特性的示例")] public ...

    几个关于C#的小例子

    在C#编程语言中,"继承"和...通过这三个小例子,初学者可以直观地了解C#中的继承和多态,并在实践中加深理解。在实际编程中,这两个特性不仅简化了代码结构,还提高了程序的灵活性和扩展性,是C#开发者必备的技能。

    C#串口操作小例子,P/Invoke

    在这个"串口操作小例子"中,我们探讨的是如何在C#中利用P/Invoke技术来与硬件设备进行通信,如通过串行端口(Serial Port)进行数据传输。P/Invoke是.NET Framework提供的一种机制,允许托管代码(Managed Code,即...

    c# 自定义特性demo

    在这个例子中,`AuthorInfo`特性可以应用于类和方法,并且可以多次应用,因为`AllowMultiple`设置为`true`。`AttributeUsage`特性用于指定新特性可以应用的目标类型。 接下来,我们将看到如何在代码中使用这个...

    C#100个小例子.rar

    这个"C#100个小例子"的压缩包文件显然是为了帮助初学者或有一定基础的学习者更好地理解并掌握C#语言的核心概念和常见操作。下面我们将详细探讨这些例子可能涵盖的知识点。 1. **基本语法**: C#的基础包括变量声明、...

    C#net入门50例子

    在每个例子中,应当包含问题的描述、解决方案的代码、以及代码的运行和调试技巧,这样有助于学习者理解每个概念的实际应用。同时,解决每个实例后,应尝试进行代码优化和错误检查,以提升编程习惯和代码质量。 总的...

    51个c#小程序例子

    在C#编程语言中,开发小程序通常涉及到各种各样的实用功能和技巧,这些小程序可以帮助初学者更好地理解C#的基础和高级特性。标题“51个C#小程序例子”表明这是一份包含多个示例项目的资源,旨在帮助学习者通过实践来...

    C#的100个小例子

    这个“C#的100个小例子”压缩包提供了丰富的实践教程,涵盖了C#语言的基础到高级特性,旨在帮助学习者通过实际操作来理解和掌握C#的用法。 1. **基础语法** - 变量声明:C#支持多种数据类型,如int、string、bool...

    C#例子 源代码

    例子中可能包括如何创建类、实例化对象以及如何使用方法和属性来实现数据操作。 3. **异常处理**:在C#中,异常处理是通过try-catch块来实现的。学习如何有效地处理可能出现的错误和异常,可以提高代码的健壮性。 ...

    FluorineFx C#搭建简单小例子

    在这个"FluorineFx C#搭建简单小例子"中,我们将深入探讨如何使用FluorineFx在C#环境中构建一个基本的服务。 首先,我们需要理解FluorineFx的工作原理。它是通过AMF(Action Message Format)协议来传输数据的,这...

    C#例子。First Head C#里的一个例子。

    【标题】"C#例子。First Head C#里的一个例子。"揭示了这是一个关于C#编程语言的实际示例,特别是涉及到“First Head”,可能是指一个基础或者关键的概念或技术。这个例子是作者亲手编写的,并且已经在Visual Studio...

    c#学习经典150例子

    C#学习经典150例子是一个全面的教程资源,涵盖了从初级到高级的各种编程概念,帮助开发者逐步提升技能,掌握C#的核心特性和实践应用。 1. **基础语法**:C#的基础语法包括变量声明、数据类型、运算符、流程控制(如...

    C#101个例子

    《C#101个例子》是一份涵盖了C#编程语言多方面应用的教程资源,旨在帮助初学者和有一定经验的开发者深入理解并熟练掌握C#的各项特性。在这个压缩包中,包含了101个独立的示例项目,每个项目都对应一个特定的知识点...

    html和c#交互小例子

    在这个例子中,当用户点击HTML页面的按钮时,会调用C#中的`CallFromHtml`方法,显示一个消息框。 5. **注意事项** - 为了安全性和兼容性,确保在部署应用时考虑目标用户的系统环境,因为WebBrowser控件依赖于用户...

    C# SOCKET 通讯例子

    在IT行业中,网络通信是软件开发的一个重要领域,特别是在分布式系统和实时数据交换的应用中。...在这个例子中,我们看到了如何使用C#实现基本的Socket通信,这对于学习网络编程和理解网络通信机制是非常有价值的。

    c#一个小例子

    "C#一个小例子"这个标题和描述指向了一个简单的C#程序示例,旨在帮助初学者入门。在这个压缩包中,包含了一个名为"MyOA"的文件,这可能是某个小型应用程序或者代码库的名称,可能与办公自动化(Office Automation)...

    C#基础知识例子

    C#是一种广泛应用于软件开发,尤其是Windows平台和.NET框架中的面向对象的编程语言。它的语法简洁、强大且灵活,使得C#成为初学者和专业开发者首选的语言之一。本压缩包包含了一系列C#基础知识的代码例子,旨在帮助...

    c# GDI+编程例子

    在这个“C# GDI+编程例子”中,我们可以看到各种实例,涵盖了GDI+的基础到高级用法。 首先,让我们深入了解一下GDI+的核心概念。GDI+提供了一个类库,包括`Graphics`、`Pen`、`Brush`、`Font`等类,用于控制图形的...

    C# 汽车租赁小例子.rar

    在汽车租赁小例子中,C#的类和对象概念被充分利用,例如定义汽车、客户和租赁业务相关的类,以模拟现实世界的实体关系。 2. **Windows Forms应用** Windows Forms是.NET Framework提供的用于构建桌面应用程序的...

Global site tag (gtag.js) - Google Analytics