C 深入學習 特性

2021-10-03 03:49:36 字數 3912 閱讀 1443

目錄

一、概述

二、基本概念

三、自定義特性

四、給物件的屬性自定義驗證規則

五、總結

特性,說的白話一點,就是說明某個東西的特殊性,它不能單獨存在,必須依附在某個東西上,這裡的東西是指c#**中類,屬性,方法。特性就是對這些類,方法,屬性進一步修飾。比如說,定義個 sting 型別 屬性a ,我們要求該屬性最小長度為5.這個要求就可以說是它的特性。

特性:乙個繼承於attribute的特殊類,以「[attribut()]」的方式依附在屬性,方法,類等其它 type型別上,從而對其進行約束,如下:

[required]

public string empno

其中[required] 就是對empno屬性修飾,約束empno不能為null,否則引數校驗就會出錯。

3.1 定義特性無參建構函式&使用

//[attributeusage(attributetargets.all)]                                //表示對該特性運用地方沒有限制

//[attributeusage(attributetargets.property|attributetargets.field)] //表示該特性只能運用到property和field

//[attributeusage(attributetargets.all,allowmultiple = true)] //allowmultiple = true 表示該特性在同一物件上多次引用

[attributeusage(attributetargets.property)] //表示該特性只能運用到property

public class maxlengthvalidateattribute: attribute

public class user

}

3.2 自定義帶參建構函式特性&使用&給內部屬性【errmsg】賦值

[attributeusage(attributetargets.property)]                        

public class maxlengthvalidateattribute: attribute

;public string errmsg ;

public maxlengthvalidateattribute(int max)

}public class user

}

注意事項:需要多個屬性值賦值,用「,」號隔開

場景設定:現在我們需要設定某些string型別的長度,int型別的大小範圍。若我們建立的類的例項如果屬性不滿足要求就報錯

1. 建立乙個驗證抽象 atrribute=>【myvalidateatrribute】(抽象出來的好處將在後面解析)

/// /// 定義乙個抽象atrribute

///

[attributeusage(attributetargets.property)]

public abstract class myvalidateatrribute:attribute

/// /// 定義驗證規則

///

///

///

public abstract bool validate(object ovalue);

}

2. 建立兩個繼承myvalidateatrribute 的atrribute,分別為

stringlengthatrribute => 驗證string屬性最大長度和最小長度

intrangattribute          => 驗證int型別大小

/// /// 驗證string屬性最大長度和最小長度

///

public class stringlengthatrribute : myvalidateatrribute

= 9999;

/// /// 最長度

///

public long min = 0;

public override string errmsg

public override bool validate(object ovalue)

}/// /// 驗證int型別大小

///

public class intrangattribute : myvalidateatrribute

/// /// long最小值

///

public long min

public override string errmsg

public override bool validate(object ovalue)

else

} else}}

3. 建立乙個記錄驗證失敗結果的類

/// /// 記錄驗證失敗結果類

///

public class validateerrresult

/// /// 錯誤資訊

///

public string errmsg

}

4. 通過泛型建立乙個class的屬性驗證方法

/// /// 針對類屬性驗證

///

public class mypropvalidate);}

}}return revalidateerr;}}

注意事項:

該處直接去找有【myvalidateatrribute】特性的屬性,避免了單獨分別處理【stringlengthatrribute】 和【intrangattribute】,應為他們都繼承於【myvalidateatrribute】而且都實現了【validate】方法

5.建立測試類 empinfo

public class empinfo

[stringlengthatrribute(min = 8, max = 10, errmsg = "工號格式有誤")]

public string empno

[intrang(min = 18, max = 45, errmsg = "年齡不符合要求!")]

public int age

}

6.測試

console.writeline("*********************特性研究*****************");

var user = new empinfo()

;foreach (var item in mypropvalidate.validate(user))

;錯誤資訊:");

}var user2 = new empinfo()

;foreach (var item in mypropvalidate.validate(user2))

;錯誤資訊:");

}

7.測試結果

特性是對type的額外描述,它也是乙個類,其實在c#編譯成中間語言il的後,可以通過反編譯軟體看到有特性的地方其實會自動生成乙個類的例項,但是在c# 中不能直接使用,所以在反射的時候可以獲得該物件訪問其中的屬性和方法。本文的例項其實在系統中早也有實現,在using system.componentmodel.dataannotations;中有很多屬性約束,例如:[required],[maxlength()] 等等。這裡只是想說明,屬性一般怎麼去用。

深入學習c 書單

本來有一本c 程式設計,一本c primer 沒怎麼看過 經過師兄推薦又買了effective c 和more effective c 技術面試的時候會問的比較深 要研究的比較透徹一些 第一篇一些同學問我,如何學好c 我沒有別的辦法給你們,唯一的辦法就是讀書,讀大 量的書,就可以解決。要把c 作為日...

C 深入學習 反射

目錄 一 概述 二 基本使用 2.1 獲取程式類容基本步驟 2.2 使用舉例 2.2.1 建立物件 訪問設定屬性值 使用其中無參方法 2.2.2 建立帶參建構函式並訪問其中帶參方法 2.2.3 反射過載過的方法 2.2.4 反射泛型類和泛型方法 2.2.5 反射型別中的私有類容 屬性 方法 2.2....

C 深入學習 委託

一 基本概念 有過買二手房交易的朋友都有感觸,辦理過戶等等一系列手續都是相當麻煩的,這個時候,房產中介出現了,我們只需要將必備資料交個中介,他們就會幫忙辦理的妥妥的,我們並不需要關係整個辦理過程,這個過程就是委託,委託房產中介辦理相關手續。再入,我們用的蘋果手機,也並不是蘋果公司直接生產,也是委託代...