gpt4 book ai didi

c# - 了解 'Attributes' 的使用

转载 作者:太空宇宙 更新时间:2023-11-03 14:55:48 24 4
gpt4 key购买 nike

我正在努力更好地理解属性 的使用。我的理解是:

现在我想对属性做更多的事情并且好奇:

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

最佳答案

真的没有什么神秘的……

属性实际上是与以下任何元素关联的对象:AssemblyClassMethodDelegateEnumEventFieldInterfaceProperty结构

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

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

来自 MSDN Attributes (C#)

Attributes provide a powerful method of associating metadata, or declarative information, with code (assemblies, types, methods, properties, and so forth). After an attribute is associated with a program entity, the attribute can be queried at run time by using a technique called reflection. For more information, see Reflection (C#).

Attributes have the following properties:

  • Attributes add metadata to your program. Metadata is information about the types defined in a program. All .NET assemblies contain a specified set of metadata that describes the types and type members defined in the assembly. You can add custom attributes to specify any additional information that is required. For more information, see, Creating Custom Attributes (C#).

  • You can apply one or more attributes to entire assemblies, modules, or smaller program elements such as classes and properties.

  • Attributes can accept arguments in the same way as methods and properties.

Your program can examine its own metadata or the metadata in other programs by using reflection. For more information, see Accessing Attributes by Using Reflection (C#).

如果你想接收关于存储在属性中的元数据的信息,你需要做这样的事情

例子

How do I read an attribute on a class at runtime? 解除

[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);
}
}

并像这样使用:

string name = typeof(MyClass).GetAttributeValue((DomainNameAttribute dna) => dna.Name);

关于c# - 了解 'Attributes' 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49274926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com