.NET中的属性是什么,它们有什么好处,我如何创建自己的属性?


当前回答

属性是一种标记类的元数据。这通常用于WinForms中,例如在工具栏中隐藏控件,但可以在您自己的应用程序中实现,以使不同类的实例以特定的方式运行。

首先创建一个属性:

[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=true)]
public class SortOrderAttribute : Attribute
{
    public int SortOrder { get; set; }

    public SortOrderAttribute(int sortOrder)
    {
        this.SortOrder = sortOrder;
    }
}

所有属性类必须有后缀“attribute”才有效。 完成此操作后,创建一个使用该属性的类。

[SortOrder(23)]
public class MyClass
{
    public MyClass()
    {
    }
}

现在你可以检查一个特定类的SortOrderAttribute(如果它有的话),方法如下:

public class MyInvestigatorClass
{
    public void InvestigateTheAttribute()
    {
        // Get the type object for the class that is using
        // the attribute.
        Type type = typeof(MyClass);

        // Get all custom attributes for the type.
        object[] attributes = type.GetCustomAttributes(
            typeof(SortOrderAttribute), true);

        // Now let's make sure that we got at least one attribute.
        if (attributes != null && attributes.Length > 0)
        {
            // Get the first attribute in the list of custom attributes
            // that is of the type "SortOrderAttribute". This should only
            // be one since we said "AllowMultiple=false".
            SortOrderAttribute attribute = 
                attributes[0] as SortOrderAttribute;

            // Now we can get the sort order for the class "MyClass".
            int sortOrder = attribute.SortOrder;
        }
    }
}

如果你想了解更多这方面的信息,你可以查看MSDN,那里有很好的描述。 我希望这对你有所帮助!

其他回答

属性也通常用于面向方面编程。要获得这样的示例,请查看PostSharp项目。

如前所述,属性相对容易创建。工作的另一部分是创建使用它的代码。在大多数情况下,您将在运行时使用反射来根据属性或其属性的存在来改变行为。在某些情况下,您将检查已编译代码上的属性以进行某种静态分析。例如,参数可能被标记为非空,分析工具可以将此作为提示。

使用这些属性并了解使用它们的适当场景是大部分工作。

您可以使用自定义属性作为在子类中定义标记值的简单方法,而不必为每个子类反复编写相同的代码。我看到John Waters写的一个很好的简洁示例,介绍了如何在自己的代码中定义和使用自定义属性。

在http://msdn.microsoft.com/en-us/library/aa288454(VS.71).aspx上有一个教程

本质上,属性是您想要附加到类型(类、方法、事件、枚举等)的数据位。

其思想是,在运行时,一些其他类型/框架/工具将在属性中查询您的类型的信息并对其进行操作。

因此,例如,Visual Studio可以查询第三方控件上的属性,以确定控件的哪些属性应该在设计时出现在“属性”窗格中。

属性还可以在面向方面编程中使用,在运行时根据装饰它们的属性注入/操作对象,并向对象添加验证、日志记录等,而不影响对象的业务逻辑。

要开始创建一个属性,打开一个c#源文件,输入attribute并点击[TAB]。它将展开为一个新属性的模板。