如何使用C#自定义属性

C#编程-自定义属性 让我们继续漏洞修复示例,在这个示例中新的自定义属性被命名为BugFixingAttribute。通常的约定是在属性名称后添加单词Attribute。编译器通过允许您调用具有短版名称的属性来支持附加。在上述代码段中,编译器首先寻找名为BugFixing的属性的定义。没有找到BugFixing属性的定义时,寻找BugFixingAttribute属性的定义。每个属性必须至少包含一个构造函数。在下面的漏洞修复示例中,漏洞编号、开发人员姓名、修复日期是定位参数,标记是命名参数。getsetget。 阅读详情

在.NET框架中,经常用到属性,从定义哪些类是可序列化到选择某个Web服务应用中的哪些方法是可以公开的都会用到属性。使用属性可以在设计时对类、properties和方法添加说明,然后在运行时通过反射信息来检查它们。本文为我们介绍了在开发应用时如何利用C#自定义属性。

本文可以从技术文章下载出获得,其中包含了一个使用定制属性的Visual Studio项目示例文件。

属性类是设计时可应用于类、properties和方法的特殊文类。属性类提供描述元素某些方面属性的方式或决定依附于该元素的其它类的行为,进而在运行时可以访问和检验这些描述与行为。你可以将属性类看作为类成员添加特殊修改器的一种方式。

例如,如果你曾经写过Web服务,那肯定知道要使得方法在整个服务中是公开的,必须要使用WebMethod属性。这是一个演示属性应用的很好的例子,因为我们要用WebMethod属性扩展编程模型。C#中没有内建的方式来指定某个方法通过Web服务是可见的(因为内建有表明一个方法是私有的方式),因此需要添加WebMethod属性来满足这一需要。

设计自定义属性

设计自定义属性的过程十分简单,在设计属性前只需要考虑以下几个方面:

  • 使用属性的目的是什么?

属性可以以很多方式使用。你需要定义属性到底要完成什么功能并确保这些特定功能没有内建在.NET框架集中。使用.NET修改器要比使用属性好,因为这将简化同其它装配件的集成过程。

  • 属性必须储存什么信息?

属性是打算用来指示某个功能的简单标志吗?或者属性是否要储存信息?一个属性可以拥有设计时赋予的一组信息,并在运行时查看这些信息。例如,看一下示例应用中的别名属性。

  • 属性应该驻留在哪个装配件中?

大多数情况下,可以将属性包含在使用该属性的装配件中。不过也有这样的例子,将属性驻留在公共的、轻量级的、共享装配件中会更好些。这种类型的配置允许客户使用属性时不必引用不需要的装配件。

  • 哪些装配件将会识别属性?

如果没有模块读取属性,那么它将一文不值。你很可能将读取属性的类放在属性驻留的同一个装配件中。然而,正像前面提到的,也有这样的例子,你想将读取属性的方法与属性自身分别放在不同的装配件中。

使用属性

在我们深入了解如何设计自定义属性之前,我们需要先看一下它们是如何使用的。例如,假

定我们有一个称为“Hide”的属性它能够有效地隐藏Properties,因此它们不会显示在屏幕上。如果我们将这个属性应用于“SSN”property,那么代码将会如列表A所示。

列表 A

[Hide ()]
public string SSN
{
get { return _ssn; }
set { _ssn = value; }
}

作为更复杂一点的例子,假设我们将有一个属性称为“Alias”。该属性的任务是检查一个property可能拥有别名。这将允许将一个property值映射给另一个property即使批roperty的名字不匹配。这个属性接受一系列字符串值作为映射名。(列表B)

列表 B

[Alias ("FirstName", "First")]
public string FName
{
get { return _fName; }
set { _fName = value; }
}

在这个例子中,property“FName”被映射到“FirstName”和“First”,请查看示例应用以更详细的了解这种应用。

创建属性

创建属性是一个简单的过程。你可以定义继承自System.Attribute类的一个包含你想要储存的数据的类。列表C的前半部分显示了如何创建一个名为“Alias”的属性。

列表 C

Class Alias : System.Attribute
{
string[] _names;
public Alias(params string[] names)
{
this.Names = names;
}
public string[] Names
{
get { return _names; }
set { _names = value; }
}
}

正如你所看到的,这就是一个普通的类,唯一的例外就是继承自System.Attribute类。我们不需要作任何特别的事情使它成为一个类。我们只是简单的定义了一个需要使用的构造函数并创建了一个property和一个存储数据的私有成员。

列表D是个更简单的属性——“Hide”属性。这个属性不需要构造函数(使用默认的构建函数),也不储存数据。因为这个属性只是一个简单的标志类型的属性。

列表 D

Class Hide : System.Attribute
{
//This is a simple attribute, that only requires
// the default constructor.
}

从代码中读取属性

读取属性并检查其中的数据比使用属性或创建属性显著地更加复杂。读取属性要求开发人员要对如何使用一个对象的反射信息有个基本了解。如果你不熟悉反射机制,可以阅读“应用反射”系列文章。

假设我们正在查看一个类,我们想知道该类的那个properties使用了Alias属性以及都有哪些别名。列表E实现了这个功能。

列表 E

Private Dictionary<string, string> GetAliasListing(Type destinationType)
{
//Get all the properties that are in the
// destination type.
PropertyInfo[] destinationProperties = destinationType.GetProperties();
Dictionary<string, string> aliases = newDictionary<string, string>();
for each (PropertyInfo property in destinationProperties)
{
//Get the alias attributes.
object[] aliasAttributes =
property. GetCustomAttributes( typeof(Alias), true);

//Loop through the alias attributes and
// add them to the dictionary.
foreach (object attribute in aliasAttributes)
foreach (string name in ((Alias)attribute).Names)
aliases.Add(name, property.Name);
//We also need to add the property name
// as an alias.
aliases.Add(property.Name, property.Name);
}
return aliases;
}

这段代码最重要的地方是对GetCustomAttributes的调用以及循环遍历属性提取别名的地方。

GetCustomAttributes方法可以在我们从对象类型中提取的PropertyInfo类中找到。在上面的应用中,我们将要查询的属性类型作为参数传给GetCustomAttributes方法,同时还将“true”传递给该方法使得可以列出继承的属性。如何发现匹配的属性,GetCustomAttributes方法将返回一个对象数组。还有另外一种超负荷方法可以列出property上的所有属性,而不管属性类型是什么。

一旦有了属性,我们需要检查它们并从中提取需要的信息。这可以通过遍历由GetCustomAttributes方法得到的对象数组并将每个对象映射成我们要查询的属性来完成。在完成映射后,我们就可以像访问任意其它类的properties一样来访问属性的properties。

正如我在前面所说,读取属性是最困难的部分。然而,一旦我们写后读取属性的代码后,将来回忆和实施起来就相当容易了。

应用示例

我强烈建议你下载本文包含的这个应用示例。这个应用示例在一个简单的Windows应用中实现了下面的属性,并演示了如何读取和使用它们。

  • Alias——这同上面提到的Alias属性一样。当你需要将一种类型的对象翻译为另一种类型时,需要使用该属性。例如,如果你有一个Customer对象和一个Address对象,你可能需要将它们都翻译为一个合并的包含人名和地址的Person对象,当一个不能使用直接映射时,可以使用该属性。
  • DisplayName——示例代码中包括检查一个类实例并将它的property名称与值输出到屏幕上的代码。这个属性可用于覆盖送到屏幕显示的property名称。例如,一个名为“FName”property可以使用DisplayName属性,因此它显示为“First Name”。
  • Examine——这个属性使得示例应用中的PrintObject方法进入更深一层,并输出使用了Examine属性的property的值。例如,示例应用中的Customer对象将Examine属性应用到Address property。这将指示PrintObject方法输出address property中的所有信息。
  • Hide——这个属性指示PrintObject()方法不要将当前property输出到屏幕。该属性用在Customer对象的SSN property上。

示例应用中包含了实现和读取属性每一步的注释,仔细看一下,我敢保证你会发现一些在自己的应用中可以利用的功能。

相关推荐

Unity热更新实战:使用Tolua为C#类添加Lua自定义属性绑定

在Unity游戏开发中,热更新技术是支撑游戏快速迭代和问题修复的关键能力。其核心原理是通过脚本语言(如Lua)动态加载和更新游戏逻辑,而无需重新发布客户端安装包。为实现C#底层框架与Lua脚本层的高效通信,需要借助绑定框架作为桥梁,将C#的类型、方法、属性等映射到Lua环境中。Tolua作为主流的预生成绑定方案,其技术价值在于通过生成高效的“粘合代码”,使得Lua能够以近乎原生操作的语法(如直接读写属性`obj.property`)调用C#功能,从而在保证运行时性能的同时,极大提升了脚本开发的直观性和开发效

weixin_29535577的博客 302

开发应用时如何利用C#自定义属性

本文可以从技术文章下载出获得,其中包含了一个使用定制属性的Visual Studio项目示例文件。属性类是设计时可应用于类、properties和方法的特殊文类。属性类提供描述元素某些方面属性的方式或决定依附于该元素的其它类的行为,进而在运行时可以访问和检验这些描述与行为。你可以将属性类看作为类成员添加特殊修改器的一种方式。例如,如果你曾经写过Web服务,那肯定知道要使得方法在整个服务中是

旅途 972

C#中实现自定义属性

通过自定义属性,我们可以为代码添加更多的元数据,以便在需要时进行进一步的处理和分析。在C#编程中,我们可以使用自定义属性来为代码添加额外的元数据。自定义属性允许我们将信息附加到类型、成员或其他编程结构上,以满足特定的需求。通过继承该基类,我们可以创建自己的自定义属性类,并使用它们来装饰代码中的各种元素。下面,让我们通过一个示例来说明如何在C#中自定义属性,这里我们创建一个名为。的自定义属性类,并将其应用到一个类的字段上。最后,我们输出了获取到的自定义属性的描述信息。的测试类,并在其中的一个字段。

TechPr的博客 687

3.C#中通过反射来获取Attribute中的信息

  阅读目录   一:属性   二:自定义属性类BookAttribute实例   . 属性是由属性类来实现的,向上篇文章《C#温故而知新学习系列之.NET框架高级特性—.NET框架中自身提供的属性(二)》我们讲的Obsolete一样,我们还可以自定义属性类,属性类是由System.Attribute派生而来的   . 在C#中为了方便起见,使用自定义属性时可以省略属性名后面的Attrib...

weixin_33852020的博客 786

在 C# 中创建和使用适用于 ASP.NET Core 的自定义属性

在C#中,自定义属性(Custom Attributes)是一种非常强大的元数据工具,它们允许你为类、方法、属性或其他成员附加额外的信息。在ASP.NET Core中,自定义属性常常用于注解模型、控制器或服务,以提供额外的功能或行为。本文将深入探讨如何在C#中创建和使用自定义属性,并通过具体的示例展示其实现过程。❓接下来,我们将通过具体的示例来展示如何在C#中创建和使用自定义属性。跟着我一起,一步步来,你会发现这一切并不难。📋定义自定义属性首先,我们需要定义一个自定义属性类。

java专栏 869

C#编程语言提供了自定义属性的功能,开发者可以使用自定义属性为类、方法或字段添加额外的元数据

C#编程语言提供了自定义属性的功能,开发者可以使用自定义属性为类、方法或字段添加额外的元数据。在本文中,我们将探讨如何使用C#自定义属性实现一个弹出编辑框的功能。通过以上的代码,我们实现了一个简单的弹出编辑框功能,使用了C#自定义属性和反射机制。当我们需要在某些地方显示编辑框时,只需要在相应的属性上应用。首先,我们需要创建一个自定义属性类,用于标记需要显示编辑框的成员。接下来,我们将应用该属性到一个类的成员上,并在需要显示编辑框的地方使用。最后,将用户输入的值转换为属性的类型,并使用。

m0_47037246的博客 151

C#开发学习笔记:使用PropertyGridControl编写自定义属性

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System....

JustWantToFly的博客 5024

ArcGIS渔网分割实战:用Create Fishnet快速生成1km×1km网格(附GDP数据分析案例)

本文详细解析了ArcGIS中Create Fishnet工具在渔网分割中的应用,从基础操作到GDP空间分析全流程。通过1km×1km网格的创建与优化,实现经济数据的空间标准化和可视化表达,解决数据融合与分析的三大核心痛点。

weixin_29250403的博客 295

在C#里使用属性,如Obsolete,Serializable,XmlRoot 【自定义属性】

属性是一种新的声明性信息.使用属性既可以定义设计级信息(例如一个帮助文件或一个文档链接)又可以定义运行时信息(例如使一个XML和一个类相关联).也可以使用属性创建"自描述"组件.通过此篇教程,我们将了解如何创建并附加属性到不同的程序实体,和在运行时如何找到属性信息.定义MSDN的描述是属性是附加说明的信息,既一个声明的详细说明使用预定义属性在C#里有一小部分预定义属性.在学习如何创建我们自定义属性...

weixin_68436326的博客 297

CHARLS数据库下载避坑指南:从注册到数据获取的完整流程(2023最新版)

本文提供2023年最新版CHARLS数据库下载与使用全流程指南,涵盖从注册、数据申请到清洗的高效实践。重点解析邮箱选择、协议签署等关键步骤,并分享多线程下载、格式转换等实用技巧,助力研究者快速获取并处理这一中国中老年健康研究的黄金标准数据。

red88的博客 920

conda upgrade出现Solving environment:failed CondaValueError Malformed version string invalid chars解决方案

本文主要介绍了conda install出现Solving environment:failed、CondaValueError: Malformed version string invalid character(s),希望能对使用conda的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 步骤一 2.2 步骤二

weixin_43178406的博客 8万+

(转)如何使用C#自定义属性

在.NET框架中,经常用到属性,从定义哪些类是可序列化到选择某个Web服务应用中的哪些方法是可以公开的都会用到属性。使用属性可以在设计时对类、properties和方法添加说明,然后在运行时通过反射信息来检查它们。本文为我们介绍了在开发应用时如何利用C#自定义属性。 本文可以从技术文章下载出获得,其中包含了一个使用定制属性的Visual Studio项目示例文件。 属性类是设计时可应用于类、p...

weixin_34061482的博客 130

AI智能体在零售行业的5大变革性应用

本文旨在全面介绍AI智能体在零售行业的关键应用场景,分析其技术原理和商业价值,帮助读者理解这些技术如何改变传统零售模式。文章将从核心概念入手,逐步深入五大应用场景的技术实现,最后探讨未来趋势和挑战。AI智能体:能够感知环境、做出决策并执行行动的智能软件实体机器学习:让计算机从数据中学习模式而无需显式编程的技术深度学习:基于神经网络的机器学习方法,能够处理复杂模式识别核心概念回顾AI智能体是零售数字化转型的关键驱动力从推荐系统到库存管理,AI正在重塑每个零售环节。

AI 原生应用开发的博客 1350

c#中实现自己的索引器,使用foreach遍历自定义类中的某个属性

c#中实现自己的索引器,使用foreach遍历自定义类中的某个属性

w884540的博客 760

13. MIC配置

恒玄BES2700,支持3个MIC。

雪飞_海 925

【大模型应用开发-FastAPI框架】(八)Sqlalchemy+postgresql简单增删改查

语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。因此,SQLAlchemy采用了类似于。社区中成为广泛使用的ORM工具之一,不亚于Django的ORM框架。和declarative等可选插件可以让用户使用声明语法。SQLAlchemy首次发行于2006年2月,并迅速地在。SQLAlchemy“采用简单的。二、安装postgresql。一、SQLAlchemy简介。的数据映射模型,而不是其他。

2098

C#如何创建自定义控件以及添加自定义属性和事件使用

C#本身提供了很强大的控件库,但是很多控件库的功能只是一些基本的功能,就比如最简单的按钮,C#提供了最基础的按钮使用方法,但是如果要增加一些功能,比如按钮按下要一个图片,弹起要另一个图片这样的工作。当然,我们可以对相关按钮在点击函数中进行更改其背景图片,但是这对于大量的按钮调用来说十分不方便,代码重用率相当的高,会导致使用上的卡顿,在这种情况下,我们可以将这个功能封装起来,这样每次调用起来就很方便...

bluecard2008的博客 4487

17、Nimble 包开发与并行编程指南

本文介绍了Nimble包的开发与版本管理流程,涵盖语义化版本控制规范及发布步骤;深入探讨了Nim中的并行编程基础,包括并发与并行的区别、threads模块与threadpool模块的使用方法及其差异;分析了线程执行的不确定性、线程池的优势,并提供了线程同步和资源管理的实践示例,帮助开发者高效构建稳定、高性能的Nim应用程序。

wine的专栏 56

C# 中“自定义属性” 功能和 反射的使用 例子

这里的“属性”指的是 “Attribute ”,另外一个名字是“ metadata” (元数据?)。 就是嵌入在对象中的运行时信息了,可以在你的程序中在运行时检查到,便于控制你的程序如何处理数据。结合反射(Reflection)来使用可以实现很有意思的应用。 这个用法在自定义框架里面经常会看到的,就是声明类或者方法的时候在前面用 [xxxxx] 这样的中括号来定义属性 ,下面代码里面有用法了。更详...

weixin_30662849的博客 137

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ocx html 自定义属性,C#创建自定义控件及添加自定义属性和事件使用实例详解

前言C#本身提供了很强大的控件库,但是很多控件库的功能只是一些基本的功能,就比如最简单的按钮,C#提供了最基础的按钮使用方法,但是如果要增加一些功能,比如按钮按下要一个图片,弹起要另一个图片这样的工作。当然,我们可以对相关按钮在点击函数中进行更改其背景图片,但是这对于大量的按钮调用来说十分不方便,代码重用率相当的高,会导致使用上的卡顿,在这种情况下,我们可以将这个功能封装起来,这样每次调用起来就很...

weixin_32308019的博客 271

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: asp.net跨页传递控件绑定参数的方式
下一篇: Lucene.Net 2.3.1开发介绍 —— 简介
Caesar525
博客等级 码龄19年 11粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值