理解'属性'的使用

时间:2018-03-14 10:11:01

标签: c# reflection .net-attributes

我正在尝试更好地理解Attributes 的使用。 我理解:

现在我想做更多关于属性和好奇的事情:

  • 预定义属性(例如DllImportAttributeSTAThread)如何执行这些功能?因为我们只使用这些属性并执行各自的功能。例如在DllImportAttribute的帮助下,我只声明我的方法abc()需要xyz.dll并且加载了相应的DLL。我没有编写代码来搜索和加载DLL xyz.dll
  • 剂量 .NET运行时环境或编译器为预定义属性提供特殊处理?这里通过特殊处理我的意思是,剂量 .NET运行时环境或编译器检测到代码中使用了一些预定义属性并运行各自的方法?
  • 如果是这样的话,我怎么能用.NET运行时环境或编译器提供/添加这些信息(即使只在我的本地PC上),这样只要在任何项目中使用我的用户定义属性,它就会运行一个特殊的方法?

1 个答案:

答案 0 :(得分:0)

真的没有神秘感......

属性实际上是与以下任何元素相关联的对象:AssemblyClassMethodDelegateEnum,{{ 1}},EventFieldInterfaceProperty

它们可用于关联声明性信息并使用反射检索此类信息(在运行时)。换句话说,如果需要使用反射,您可以使用属性将其他信息注入可在运行时查询的程序集。

属性基本上只包含其名称和可选的参数列表。

来自MSDN Attributes (C#)

  

属性提供了一种强大的关联元数据的方法,或   声明性信息,包含代码(程序集,类型,方法,   属性,等等)。属性与a关联后   程序实体,可以在运行时使用a查询属性   技术称为反射。有关更多信息,请参阅反射   (C#)。

     

属性具有以下属性

     
      
  • 属性为程序添加元数据。元数据是关于程序中定义的类型的信息。所有.NET程序集都包含一个   指定的元数据集,用于描述类型和类型成员   在程序集中定义。您可以添加自定义属性以指定任何属性   需要的其他信息。有关更多信息,请参阅,   创建自定义属性(C#)。

  •   
  • 您可以将一个或多个属性应用于整个程序集,模块或较小的程序元素,例如类和属性。

  •   
  • 属性可以采用与方法和属性相同的方式接受参数。

  •   
     

您的程序可以检查自己的元数据或其他元数据   程序使用反射。有关更多信息,请参阅访问   使用反射属性(C#)。

如果您想要接收有关存储在属性中的元数据的信息,您需要执行类似这样的操作

<强>〔实施例

取自How do I read an attribute on a class at runtime?

Struct

并使用如下:

[DomainName("MyTable")]
Public class MyClass : DomainBase
{}

...

public static class AttributeExtensions
{
    public static TValue GetAttributeValue<TAttribute, TValue>(
        this Type type, 
        Func<TAttribute, TValue> valueSelector) 
        where TAttribute : Attribute
    {
        var att = type.GetCustomAttributes(
            typeof(TAttribute), true
        ).FirstOrDefault() as TAttribute;
        if (att != null)
        {
            return valueSelector(att);
        }
        return default(TValue);
    }
}