为了账号安全,请及时绑定邮箱和手机立即绑定

.NET中的属性是什么?

.NET中的属性是什么?

元芳怎么了 2019-07-23 18:01:14
.NET中的属性是什么?.NET中的属性是什么,它们有什么用处,以及如何创建自己的属性?
查看完整描述

3 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

元数据。有关您的对象/方法/属性的数据。

例如,我可能会声明一个名为:DisplayOrder的属性,因此我可以轻松控制属性应在UI中显示的顺序。然后我可以将它附加到一个类并编写一些GUI组件来提取属性并适当地对UI元素进行排序。

public class DisplayWrapper{
    private UnderlyingClass underlyingObject;

    public DisplayWrapper(UnderlyingClass u)
    {
        underlyingObject = u;
    }

    [DisplayOrder(1)]
    public int SomeInt
    {
        get        {
            return underlyingObject .SomeInt;
        }
    }

    [DisplayOrder(2)]
    public DateTime SomeDate
    {
        get        {
            return underlyingObject .SomeDate;
        }
    }}

从而确保在使用我的自定义GUI组件时,SomeDate始终显示在SomeDate之前。

但是,您会看到它们在直接编码环境之外最常用。例如,Windows Designer广泛使用它们,因此它知道如何处理自定义对象。像这样使用BrowsableAttribute:

[Browsable(false)]public SomeCustomType DontShowThisInTheDesigner{
    get{/*do something*/}}

告诉设计者不要在设计时在“属性”窗口的可用属性中列出这个。

可能还使用它们生成代码,预编译操作(如后夏普)或运行时操作如Reflection.Emit的。例如,您可以编写一些用于分析的代码,这些代码透明地包装您的代码所做的每一次调用并对其进行计时。您可以通过放置在特定方法上的属性“选择退出”时间。

public void SomeProfilingMethod(MethodInfo targetMethod, object target, params object[] args){
    bool time = true;
    foreach (Attribute a in target.GetCustomAttributes())
    {
        if (a.GetType() is NoTimingAttribute)
        {
            time = false;
            break;
        }
    }
    if (time)
    {
        StopWatch stopWatch = new StopWatch();
        stopWatch.Start();
        targetMethod.Invoke(target, args);
        stopWatch.Stop();
        HandleTimingOutput(targetMethod, stopWatch.Duration);
    }
    else
    {
        targetMethod.Invoke(target, args);
    }}

声明它们很简单,只需创建一个继承自Attribute的类。

public class DisplayOrderAttribute : Attribute{
    private int order;

    public DisplayOrderAttribute(int order)
    {
        this.order = order;
    }

    public int Order
    {
        get { return order; }
    }}

请记住,当您使用该属性时,您可以省略编译器将为您添加的后缀“属性”。

注意:属性本身不做任何事情 - 需要一些其他代码使用它们。有时代码是为您编写的,但有时您必须自己编写代码。例如,C#编译器关心某些框架并使用某些框架(例如,NUnit在类上查找[TestFixture],在加载程序集时在测试方法上查找[Test])。
因此,在创建自己的自定义属性时,请注意它根本不会影响代码的行为。您需要编写检查属性的其他部分(通过反射)并对其进行操作。


查看完整回答
反对 回复 2019-07-23
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

很多人都回答了,但到目前为止还没有人提到这个......

属性大量用于反射。反思已经很慢了。

这是非常值得的标记您的自定义属性为sealed班提高自己的运行时性能。

考虑使用放置这样一个属性的适当位置,并将属性(!)属性指示通过也是一个好主意AttributeUsage。可用属性用法列表可能会让您感到惊讶:

  • 部件

  • 结构

  • 枚举

  • 构造函数

  • 方法

  • 属性

  • 领域

  • 事件

  • 接口

  • 参数

  • 代表

  • 返回值

  • 的GenericParameter

  • 所有

AttributeUsage属性是AttributeUsage属性签名的一部分也很酷。哇因为循环依赖!

[AttributeUsageAttribute(AttributeTargets.Class, Inherited = true)]public sealed class AttributeUsageAttribute : Attribute


查看完整回答
反对 回复 2019-07-23
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

属性是一种用于标记类的元数据。这通常在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,其中包含非常好的描述。
我希望这能帮到你!


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 810 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信