1.指定attributeusage特性
特性(attribute)類本身用乙個特性——system.attributeusage特性來標記。attributeusage主要用於標識自定義特性可以應用到哪些型別的程式元素上。這些資訊由它的第一引數給出,改引數是必選的,其型別是列舉型別的attributetargets。
attributetargets列舉的成員如下:
all,assembly,class,constructor,delegate,enum,event,field,genericparameter,inte***ce,method,module,parameter,property,returnvalue,struct。
這個列表列出了可以應用該特性的所有程式元素。注意在把特性應用到程式元素上時,應把特性放在元素前面的方括號中。但是,在上面的列表中,assembly和module的值不對應任何程式元素,它們可以應用到整個程式集或模組中,而不是應用到**中的乙個元素上,在這種情況下,這個特性可以放在源**的任何地方,但需要關鍵字assembly或module作為字首:
[assembly:someassemblyattribute(parameters)]
[module:someassemblyattribute(parameters)]
在指定自定義特性的有效目標元素時,可以使用按位or運算子把這些值組合起來。
例:[attributeusage(attributetargets.property | attributetargets.field),allowmultiple = false,inherited = false)]
attributeusage特性還包含另外兩個引數:allowmultiple和inherited。
allowmultiple引數表示乙個特性是否可以多次應用到同一項上,上面設定為false,標識編譯器在同乙個屬性或字段上新增兩次或以上的特性就會產生乙個錯誤。
inherited引數設定為true,就表示應用到類或介面上的特性也可以自動應用到所有派生的類或介面上。如果特性應用到方法或屬性上,它就可以自動應用到該方法或屬性等的重寫版本上
第一步定義特性類(放置到指定的類庫vectorclass中):
namespace whatsnewattributes
public datetime datemodified => _datemodified;
public string changes => _changes;
/// /// 可選引數,用於描述問題重要性
///
public string issues
}}namespace whatsnewattributes
}
第二步使用特性類(在另一類庫中定義實用類)
[assembly: supportswhatsnew]//這段**新增了一行用supportswhatsnew特性標記的程式集;可在呼叫的時候驗證是否在該類中使用了程式集特性
namespace vectorclass
public double y
public double z
public vector(double x, double y, double z)
[lastmodified("2023年2月10日", "方法加入格式化")]
public string tostring(string format, iformatprovider formatprovider)
switch (format.toupper())
, , )";
case "ijk":
var sb = new stringbuilder(x.tostring(), 30);
return sb.tostring();
default:
return tostring();}}
public double norm() => x * x + y * y + z * z;
[lastmodified("2023年6月6日", "新增以實現ienumerable")]
public ienumeratorgetenumerator() => new vectorenumerator(this);
ienumerator ienumerable.getenumerator() => getenumerator();
public override string tostring() => $"( , , ";
public double this[uint i]}}
}}namespace vectorclass
public bool movenext()
public object current => current;
double ienumerator.current
}public void reset()
public void dispose()}}
呼叫方式:
可建立乙個控制台執行專案進行呼叫測試或其他方式,下面我使用的是控制台輸出
class program
");if (supportsattribute == null)
else
//獲取包括在該程式集中定義的所有型別的集合
ienumerabletypes = theassembly.exportedtypes;
foreach (type definedtype in types)
console.writeline($"what\'s new 從");
console.writeline(outputtext.tostring());
console.readline();
}private static void displaytypeinfo(type type)
addtooutput($"\n類:");
ienumerableattributes = type.gettypeinfo().getcustomattributes().oftype();
if (attributes.count() == 0)
else
}addtooutput("這個類被改變過");
foreach (methodinfo method in type.gettypeinfo().declaredmethods.oftype())
;方法名:()");
foreach (attribute attribute in attributestomethods)}}
}private static void addtooutput(string v)
private static void wirteattributeinfo(attribute attribute)
datetime modifieddate = lastmodifiedattribute.datemodified;
//修改日期 < 選擇的日期
if (modifieddate < backdateto)
addtooutput($"修正::");
if (lastmodifiedattribute.issues != null)
");}}}
}
輸出結果如下:
C 自定義特性
code1 using system using system.collections.generic using system.linq using system.text namespace mylibrary.attributeclass 對於位置引數,通常只提供get訪問器 public s...
編寫自定義特性
自定義特性一般標註在作用的程式元素的上方 編譯器首先組合特性名稱和attribute,然後尋找該組合名,所以特性名為fieldname和fieldnameattribute的兩個特性沒有區別 編譯器將尋找包含有這個名稱的類,它直接或者間接的派生資system.attribute 編寫自定義類的步驟 ...
C 自定義特性
id欄位上的dbkey就是自定義特性 使用者資訊 public class user public string name 繼承attribute,實現自定義特性dbkey namespace customerattribute public dbkey public dbkey string de...