C# 中常见预定义属性的用途
介绍
在本指南中,我们将介绍 C# 最常用的功能之一。属性允许开发人员将元数据或声明性信息关联到他们的项目和代码中。我个人喜欢使用它们的方式之一是随着应用程序开发的继续,将类或函数标记为过时。首先,我们将了解什么是属性并查看一些示例。然后,我们将查看最常见的属性,并了解如何定义自己的自定义属性。
属性
代码中有许多地方可以定义属性,例如程序集、方法和类型等等。将属性与代码的选定部分关联后,您可以选择使用名为Reflection的技术对其进行查询。在 .NET 框架中,每个类型和组件(例如程序集和类)都默认定义了自己的元数据,您可以根据需要通过自定义元数据信息对其进行扩展。当您允许元数据信息时,您可以选择范围;您可以将其应用于整个程序集或仅应用于代码的特定部分。
最后,元数据最特别之处在于,您自己的应用可以检查自己的元数据和其他程序的元数据。这允许您内置兼容性检查和其他不错的功能。
有一个骨架代码,可以在使用属性时用作模板:
attribute ( positional_parameters
默认属性遵循命名约定,即您需要在自定义属性后面加上Attribute后缀。实际上,这意味着当您有一个名为DllImport的属性时,它实际上指向.NET 库中的DllImportAttribute。如果您定义自己的自定义属性,则应遵循此概念。
假设您有以下代码,它代表一台服务器。它有两个功能:一个用于重新启动机器,一个用于安装最新更新。
public class Server
{
private string _name;
public string Name { get => _name; set => _name = value; }
public Server(string name) { Name = name; }
public void UpdateServer() { Console.WriteLine($"Downloading and installing updates on server: {Name}!"); }
public void RestatServer() { Console.WriteLine($"Gracefully restarting the server: {Name}"; }
}
随着项目的发展,您可能希望添加一个额外的函数,该函数将弃用 UpdateServer (),并通过一些额外的步骤处理更新安装和重新启动任务。您如何让其他开发人员知道将引入涵盖这些功能的新功能?
您可以像这样调整代码:
public class Server
{
private string _name;
public string Name { get => _name; set => _name = value; }
public Server(string name) { Name = name; }
[Obsolete("Do not use the UpdateServer() method, use the method UpdateAndRestart()", false)]
public void UpdateServer() { Console.WriteLine($"Downloading and installing updates on server: {Name}!"); }
public void RestatServer() { Console.WriteLine($"Gracefully restarting the server: {Name}"); }
public void UpdateAndRestart() { Console.WriteLine($"Installing latest updates on machine: {Name} and restarting"); }
}
这里的关键点是以下这一行:
Obsolete("Do not use the UpdateServer() method
它需要有准确的函数名称,否则编译器将抛出错误,指出找不到我们所引用的方法。
第二个参数要么是true要么是false。当设置为false时,编译器会抛出警告,但编译仍会通过。如果设置为true,则会抛出错误异常,并且不会进行编译。这种行为在大多数预定义属性中很常见。
属性目标指向属性所针对的实体。在本例中,UpdateServer()函数就是目标。
预定义属性
预定义属性是 Microsoft 内置于 .NET 库中的一组属性。属性有一个名为[System.Attribute]的基类。每个自定义或预定义属性都从此基类继承。
最常见的预定义属性是:
- 序列化
- 非序列化
- 过时的
- 导入动态链接库
- 網絡方法
您正在开发的应用程序的类型和您为其开发的市场区域将决定您使用哪些常见的预定义属性。
自定义属性
使用 .NET 框架的任何人都可以定义自己的自定义属性以供私人使用或打包到公共库或应用程序中,但也有一些规则:
- 您的自定义属性必须从System.Attribute基类派生。
- 您必须在属性名称中添加后缀Attribute。
- 您应该使用AttributeUsage参数设置可能的目标。
- 您需要实现一个类构造函数和可写访问的属性,这意味着您的属性不能是只读的。
创建您的第一个自定义属性
本例中创建的自定义属性将以Name和Location的形式为服务器类添加元数据。名称是公司名称,位置是国家。
using System;
using System.Reflection;
namespace Pluralsight
{
[AttributeUsage(AttributeTargets.Class)]
public class CompanyAttribute : Attribute{
private string _name;
private string _location;
public string Name { get => _name; set => _name = value; }
public string Location { get => _location; set => _location = value; }
public CompanyAttribute(string company, string location) { Name = company; Location = location; }
}
[Company("Microsoft","USA")]
public class Server
{
private string _name;
public string Name { get => _name; set => _name = value; }
public Server(string name) { Name = name; }
[Obsolete("Do not use the UpdateServer() method, use the method UpdateAndRestart()", false)]
public void UpdateServer() { Console.WriteLine($"Downloading and installing updates on server: {Name}!"); }
public void RestatServer() { Console.WriteLine($"Gracefully restarting the server: {Name}"); }
public void UpdateAndRestart() { Console.WriteLine($"Installing latest updates on machine: {Name} and restarting"); }
}
public class ComPredefAttr
{
public static void Main()
{
Server a = new Server("Domain Controller");
MemberInfo info = typeof(Server);
object[] attrib = info.GetCustomAttributes(typeof(CompanyAttribute), false);
foreach (Object attribute in attrib)
{
CompanyAttribute b = (CompanyAttribute)attribute;
Console.WriteLine($"{b.Name}, {b.Location}");
}
Console.ReadKey();
}
}
}
您已经定义了部分代码——这里的新内容是 CompanyAttribute类。它遵循自定义属性标准,因为它具有正确的名称和可公开写入的属性。请注意,当您想要将此属性应用于Server类时,引用如何变化。
执行代码后,将出现以下输出:
Microsoft, USA
为了从属性中提取元数据,需要导入System.Reflection命名空间。然后在Main()函数中,如何访问数据将变得清晰起来。有了这些数据,就可以在应用程序中实现自定义逻辑,并且您将能够优化执行。
结论
在本指南中,您了解了属性的概念以及它们对 C# 和 .NET 库的重要性。您了解了自定义属性以及在应用程序中使用它们的一些最佳实践。最后,您定义了第一个自定义属性。我希望本指南对您有所帮助,并感谢您阅读它!
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~